2013-05-08 11 views
7

Próbuję zrozumieć _why za cloaker sposobu, który pisał o w „A Block Costume”:Ruby: metoda Cloaker Zrozumienie _why za

class HTML 
    def cloaker &blk 
    (class << self; self; end).class_eval do 
     # ... rest of method 
    end 
    end 
end 

Zdaję sobie sprawę, że class << self; self; end otwiera Eigenclass z self, ale nigdy widać, że ktoś robi to wcześniej w instancji metody. Co to jest self w miejscu, w którym to robimy? Byłem pod wrażeniem self powinny być odbiornik, że metoda została wezwana, ale cloaker nazywany jest od wewnątrz method_missing:

def method_missing tag, text = nil, &blk 
    # ... 
    if blk 
    cloaker(&blk).bind(self).call 
    end 
    # ... 
end 

Więc co jest self wewnątrz zaproszenia method_missing? A co jest self gdy wzywamy:

((class << self; self; end).class_eval) 

wewnątrz metody cloaker?

Zasadniczo chcę wiedzieć, czy otwieramy Eignenclass klasy HTML, czy też robimy to dla określonej instancji klasy HTML?

+2

Nie jestem pewien, czy rozumiem pytanie. 'method_missing' jest metodą instancji, więc' self' odnosi się do konkretnej instancji i 'class << self; samego siebie; end' zwraca Eigenclass tej instancji. – Stefan

+0

Zauważ, że oficjalny termin to 'singleton_class' –

Odpowiedz

1

Wewnątrz metody cloaker, self będzie instancją HTML, ponieważ wywołasz ją na obiekcie, więc skutecznie tworzysz metodę Singleton na instancjach klasy HTML. Na przykład:

class HTML 
    def cloaker &blk 
    (class << self; self; end).class_eval do 
     def new_method 
     end 
    end 
    end 
end 

obj = HTML.new 
obj.cloaker 
p HTML.methods.grep /new_method/ # [] 
p obj.singleton_methods # [:new_method] 

Edycja

Albo jak Jörg W Mittag skomentował, tylko pre-1,9 sposobem wywołującego "Object#define_singleton_method"

+3

Oczywiście, jak na Ruby 1.9, jest to po prostu' def kratka (& blk) define_singleton_method (: new_method, & blk) end' –