__callee__ 和 __method__ 之间的区别

Difference between __callee__ and __method__

在Ruby中,可以使用

__callee__ 

__method__ 

查找当前执行方法的名称。

两者有什么区别?

换句话说documentation__callee__是调用者调用的方法的名称,而__method__是定义时方法的名称。以下示例说明了差异:

class Foo

  def foo
    puts __callee__
    puts __method__
  end

  alias_method :bar, :foo
end

如果我调用 Foo.new.foo 那么输出是

foo
foo

但是如果我调用 Foo.new.bar 那么输出是

bar
foo

__method__ returns :foo 在这两种情况下,因为这是定义的方法的名称(即 class 有 def foo),但是在第二个示例中,调用者调用的方法的名称是 bar,因此 __callee__ returns 即

__method__returns定义名称,__callee__returns调用姓名。 它们通常是相同的,但在别名方法中不同。

def foo
[__method__, __callee__]
end
alias bar foo
p foo #=> [:foo, :foo]
p bar #=> [:foo, :bar]

link

__method__ 静态查找名称,它指的是最近的词法封闭方法定义的名称。 __callee__ 动态查找名称,它指的是调用方法的名称。 两者都不需要对应于最初发送的消息:

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]