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)
解释文档,__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__返回该名称.
小智 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)