2013-05-08 11 views
7

sto cercando di capire cloaker il metodo di _why che ha scritto su in "A Block Costume":Rubino: il metodo cloaker di _why intesa

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

mi rendo conto che class << self; self; end apre l'Eigenclass di self, ma non ho mai visto nessuno fare questo all'interno di un metodo di istanza prima. Qual è self nel punto in cui lo facciamo? Ho avuto l'impressione self dovrebbe essere il ricevitore che il metodo è stato chiamato, ma cloaker si chiama dall'interno method_missing:

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

Allora, qual è self dentro la chiamata method_missing? E ciò che è self quando chiamiamo:

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

all'interno del metodo cloaker?

sostanza, voglio sapere se ci stiamo aprendo l'Eignenclass della classe HTML, o se lo stiamo facendo a una specifica istanza della classe HTML?

+2

Non sono sicuro se ho capito la tua domanda. 'Method_missing' è un metodo di istanza, quindi' self' riferisce al caso specifico e 'classe << sé; se stesso; FINE' restituisce l'Eigenclass di tale istanza. – Stefan

+0

Nota che il termine ufficiale è 'singleton_class' –

risposta

1

All'interno del metodo cloaker, self sarà un'istanza di HTML poiché lo chiamerai su un oggetto, pertanto creerai effettivamente un metodo Singleton su istanze di classe HTML. Per esempio:

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] 

Modifica

O come ha commentato Jörg W Mittag, solo un pre-1.9 via del chiamante "Object#define_singleton_method"

+3

Naturalmente, come di Ruby 1.9, che è fondamentalmente solo' def cloaker (& BLK) define_singleton_method (: NEW_METHOD, e BLK) FINE' –