【发布时间】:2016-05-25 06:55:24
【问题描述】:
在 Ruby 中,可以使用任一
__callee__
或
__method__
查找当前正在执行的方法的名称。
两者有什么区别?
【问题讨论】:
标签: ruby metaprogramming
在 Ruby 中,可以使用任一
__callee__
或
__method__
查找当前正在执行的方法的名称。
两者有什么区别?
【问题讨论】:
标签: ruby metaprogramming
__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]
【讨论】:
__method__ 返回定义的名称,__callee__ 返回被调用的名称。 它们通常相同,但在别名方法上有所不同。
def foo
[__method__, __callee__]
end
alias bar foo
p foo #=> [:foo, :foo]
p bar #=> [:foo, :bar]
【讨论】:
解释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__ 在这两种情况下都返回:foo,因为这是定义的方法的名称(即类具有def foo),但在第二个示例中,调用者正在调用的方法的名称是@987654332 @ 等__callee__ 返回。
【讨论】: