Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between __callee__ and __method__

Tags:

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?

like image 259
port5432 Avatar asked Feb 14 '16 11:02

port5432


Video Answer


2 Answers

__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] 
like image 126
Jörg W Mittag Avatar answered Nov 07 '22 05:11

Jörg W Mittag


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.

like image 32
Frederick Cheung Avatar answered Nov 07 '22 04:11

Frederick Cheung