2012-12-09 6 views

risposta

37

Senza respond_to_missing? definito, cercando di ottenere il metodo tramite method fallirà:

class Foo 
    def method_missing name, *args 
    p args 
    end 

    def respond_to? name, include_private = false 
    true 
    end 
end 

f = Foo.new 
f.bar #=> [] 
f.respond_to? :bar #=> true 
f.method :bar # NameError: undefined method `bar' for class `Foo' 

class Foo 
    def respond_to? *args; super; end # “Reverting” previous redefinition 

    def respond_to_missing? *args 
    true 
    end 
end 

f.method :bar #=> #<Method: Foo#bar> 

Marc-André (un nucleo committer rubino) presenta una buona blog post on respond_to_missing?.

+1

Oooh, questa è una buona risposta! Sto cancellando il mio. Grazie per avermi insegnato qualcosa di nuovo! – joelparkerhenderson

+0

Grazie per l'informazione. – sawa

+0

Per motivi di interesse, a cosa serve "answer_to?". C'è un caso d'uso legittimo per questo? –