__callee__和__method__之间的区别

ard*_*igh 14 ruby metaprogramming

在Ruby中,可以使用其中之一

__callee__ 
Run Code Online (Sandbox Code Playgroud)

要么

__method__ 
Run Code Online (Sandbox Code Playgroud)

找到当前正在执行的方法的名称.

两者有什么区别?

Jör*_*tag 19

__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]
Run Code Online (Sandbox Code Playgroud)


Fre*_*ung 7

解释文档,__callee__是调用者调用__method__的方法的名称,而是定义时方法的名称.以下示例说明了不同之处:

class Foo

  def foo
    puts __callee__
    puts __method__
  end

  alias_method :bar, :foo
end
Run Code Online (Sandbox Code Playgroud)

如果我打电话,Foo.new.foo那么输出就是

foo
foo
Run Code Online (Sandbox Code Playgroud)

但如果我打电话,Foo.new.bar那么输出就是

bar
foo
Run Code Online (Sandbox Code Playgroud)

__method__:foo在两种情况下都返回,因为这是定义的方法的名称(即类具有def foo),但在第二个示例中,调用者正在调用的方法的名称是bar,因此__callee__返回该名称.

  • 我认为别名(通过alias或alias_method)是他们唯一不同的时间. (2认同)

小智 7

__method__返回已定义的名称,而__callee__返回名为name的名称.它们通常相同,但在别名方法上有所不同.

def foo
[__method__, __callee__]
end
alias bar foo
p foo #=> [:foo, :foo]
p bar #=> [:foo, :bar]
Run Code Online (Sandbox Code Playgroud)

链接