2012-01-24 13 views
6

Mi chiedo: c'è un modo per chiamare un metodo da sé in Ruby senza usare il suo nome?Ruby: esiste una parola chiave per chiamare un metodo da sé stesso (analogo a super)?

Se il metodo è stato creato con alcune tecniche di metaprogrammazione, chiamarlo con il suo nome potrebbe essere difficile da leggere. Anche per un metodo solitamente definito, se non si è sicuri di un buon nome, o se il suo nome è lungo, chiamarlo da sé con qualche parola chiave (analogo a super) potrebbe essere conveniente.

risposta

11

È possibile utilizzare Kernel#__method__ che restituisce il nome del metodo corrente come Symbol. A differenza di super non è una parola chiave ma un metodo normale, quindi è necessario passarlo al metodo send insieme agli argomenti richiesti per chiamare il metodo.

Ecco cosa __method__ rendimenti:

obj = Object.new 

def obj.foo 
    p __method__ 
end 

obj.foo 
# => :foo 

Ed ecco un esempio di metodo di classe che definisce in modo dinamico i metodi fattoriali:

class Foo 
    def self.define_fact(method_name) 
    define_method(method_name) do |n| 
     n > 0 ? n * send(__method__, n - 1) : 1 
    end 
    end 
end 

f = Foo.new 
# puts f.fact(5) 
# => undefined method `fact' for #<Foo:0x8ede45c> (NoMethodError) 
Foo.define_fact :fact 
puts f.fact(5) 
# => 120 

Senza __method__ non riesco a pensare a qualsiasi soluzione che wouldn coinvolgere una specie di eval che è meglio evitare se possibile.

+0

Grazie KL-7, presumo dalla tua risposta che non ci sia una parola chiave speciale per questo. – Alexey

Problemi correlati