__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]
__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]
在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]
__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]