method_missing
显示在Object.private_methods
中,而不在Object.public_methods
中。
然而,当我致电Object.method_missing :stupidmethod
时,我得到了
NoMethodError: undefined method `stupidmethod' for Object:Class
我希望得到
NoMethodError: private method `method_missing' called for Object:Class
因为这是我尝试调用Object
的其他私有方法时获得的内容,例如Object.chop
。
作为更多证据,如果我在没有争论的情况下致电Object.method_missing
,我会得到
ArgumentError: no id given
因此,似乎我真的从其对象外部调用“私有”method_missing
函数。你能解释一下吗?
ruby --version
告诉我1.8.7。此外,irb --version
是0。9。5(2013年4月5日)。很高兴知道这在我以后的版本中会有所期待。
答案 0 :(得分:1)
调用Object
的私有方法不是Kernel
中的模块方法。您可以按照answer to a similar question:
set_trace_func
调用的方法
irb(main):001:1> set_trace_func proc { |event, file, line, id, binding, classname| printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname if id.to_s == 'method_missing' }
=> #<Proc:0x0423d278@(irb):1>
irb(main):002:0> Object.method_missing :test
c-call (irb):4 method_missing Kernel
c-return (irb):4 method_missing Kernel
NoMethodError: undefined method `test' for Object:Class
from (irb):4
from :0
正如一些评论者在比1.8.7更新的MRI中指出,此行为已发生变化:method_missing
已从Kernel
中移除,而来自Object
的私有实例方法已移至{{ 1}}这是新的超类。