在方法定义中,有没有办法判断方法 method_missing
是被显式调用还是作为钩子(Hook)方法被调用?
使用方法initialize
,可以通过执行以下操作来判断它是被显式调用还是作为钩子(Hook)调用:
class A
def initialize
puts caller
end
end
当作为钩子(Hook)调用时,initialize
方法有一行 new
:
a = A.new
# => ...:in `new'
# => ...
# => ...:in `<main>'
当显式调用时,它没有这样的行(除非它是从 new
显式调用的):
a.send(:initialize)
# => ...
# => ...:in `<main>'
但是当我用 method_missing
做类似的事情时,我无法区分这两种情况:
class A
def method_missing *;
puts caller
end
end
a.foo
# => ...
# => ...:in `<main>'
a.method_missing
# => ...
# => ...:in `<main>'
最佳答案
你可以检查第一个参数:
class A
def method_missing(name = nil, *)
if name
puts "called via `#{name}'"
else
puts "called directly"
end
end
end
A.new.foo
#=> called via `foo'
A.new.method_missing
#=> called directly
关于ruby - 有没有办法判断 `method_missing` 是否被显式调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35250641/