2012-10-17 11 views

Odpowiedz

21

Oto kod:

Dla wersji> = 1.9:

def funky_method 

    return __callee__ 

end 

< Dla wersji 1.9:

def funky_method 

    return __method__ 

end 
+3

Synonim: '' __method__' – steenslag

+1

Tylko __method__' będzie działać w 1.8, '__callee__' pochodzi z 1,9 – UncleGene

+1

Więc mówisz, że' __method__' nie działa dla Ruby w wersji> = 1,9? Zgodnie z odpowiedzią Chetana Patila, wytwarzają one różne wartości, dzwoniący kontra nazwa metody, w której się znajdujesz. –

0

bardzo proste:

 

def foo 
    puts __method__ 
end 
 
7

__callee__ zwraca "wywoływaną nazwę" bieżącej metody, podczas gdy __method__ zwraca "nazwę w definicji" bieżącej metody.

W rezultacie __method__ nie zwraca oczekiwanego wyniku, gdy jest używany z alias_method.

class Foo 
    def foo 
    puts "__method__: #{__method__.to_s} __callee__:#{__callee__.to_s} " 
    end 

    alias_method :baz, :foo 
end 

Foo.new.foo # __method__: foo __callee__:foo 
Foo.new.baz # __method__: foo __callee__:baz