In Ruby, one can use either
__callee__ or
__method__ to find the name of the currently executing method.
What is the difference between the two?
__method__ looks up the name statically, it refers to the name of the nearest lexically enclosing method definition. __callee__ looks up the name dynamically, it refers to the name under which the method was called. Neither of the two necessarily needs to correspond to the message that was originally sent:
class << (foo = Object.new) def bar(*) return __method__, __callee__ end alias_method :baz, :bar alias_method :method_missing, :baz end foo.bar # => [:bar, :bar] foo.baz # => [:bar, :baz] foo.qux # => [:bar, :method_missing]
To paraphrase the documentation, __callee__ is the name of the method that the caller called, whereas __method__ is the name of the method at definition. The following example illustrates the difference:
class Foo def foo puts __callee__ puts __method__ end alias_method :bar, :foo end If I call Foo.new.foo then the output is
foo foo but if I call Foo.new.bar then the output is
bar foo __method__ returns :foo in both cases because that is the name of the method as defined (i.e. the class has def foo), but in the second example the name of the method the caller is calling is bar and so __callee__ returns that.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With