2012-05-27 11 views
5

Próbuję połączyć moduł z klasą i chcę, aby niektóre metody zachowywały się jak metody klasy, a inne były metodami instancji.klasa << notacja w modułach

Jednak nie chcę zarówno dla includeiextend modułu. Wolę tylko include to.

Kiedy owinąć metody chcę być metody klasy w tym zapisie to działa:

class << 
    # ... 
end 

Jednak kiedy używam tego zapisu nie działa:

class << self 
    # ... 
end 

I podejrzenie, że słowo kluczowe self ustanawia wyraźne powiązanie z modułem, a nie z klasą, w którą się miesza. Ale nie widziałem żadnej dokumentacji, która zaleca pozostawienie słowa kluczowego self wyłączone podczas korzystania z notacji class <<.

Czy ktoś wie, co się dzieje z tym?


UPDATE: Oto niektóre przykładowy kod dla większej jasności:

module M 
    class << 
    def class_method 
     puts "From inside the class_method" 
    end 
    end 

    def instance_method 
    puts "From inside the instance_method" 
    end 
end 

class Object 
    include M 
end 

class C 
end 


C.class_method 

obj = C.new 
obj.instance_method 
+1

Huh, czy coś mi umknęło? 'class << end' jest błędem składni. – sepp2k

Odpowiedz

6

class << musi być zawsze następuje obiektu. Tylko class <<; end jest błędem składni. W twoim przypadku wygląda na to, że działa z powodu następujących powodów:

class << 
    def class_method 
    puts "From inside the class_method" 
    end 
end 

jest taka sama jak

class << def class_method 
    puts "From inside the class_method" 
    end 
end 

która jest taka sama jak

temp = def class_method 
    puts "From inside the class_method" 
end 
class << temp 
end 

która jest taka sama jak

def class_method 
    puts "From inside the class_method" 
end 
class << nil 
end 

która jest t to samo co

def class_method 
    puts "From inside the class_method" 
end 

Oczywiście to nie definiuje metody klasy. Definiuje metodę instancji.

+0

Lol. To wyjaśnia, dlaczego "pozorna" metoda klasowa musiała być w Object to work. W rzeczywistości była to metoda pojedynczej instancji. Dobra robota. – Nathan

0

Tak, jeśli chcesz, aby uzyskać prawdziwy self w module należy użyć includedcallback. Coś jak tym momencie we właściwym kierunku:

module Bar 
    def self.included(base) 
    class << base 
     def class_method 
     "class_method" 
     end 
    end 
    end 
end 

class Foo 
    include Bar 
end 


p Foo.class_method # => "class_method" 
+0

Wierzę, że właśnie to chce rozwiązać swój problem, ale nie odpowiada na pytanie, co robi "klasa <<" w porównaniu do "klasy << ja". –

+0

podobne do @ sepp2k powiedział "klasa << koniec" jest błędem składni. Więc właściwie nie wiem, co Nathan ma na myśli :( –

+0

Dzięki Nash, wiem o włączonej metodzie, ale odkryłem, że pozostawienie samowystarczalności wydaje się osiągnąć podobny efekt. Nie otrzymuję błędu składni i próbowałem w ruby 1.8 i 1.9.3 - Wkrótce wyślę całą próbkę kodu, aby inni mogli ją wypróbować: – Nathan

Powiązane problemy