method_missing Ruby中的可见性

时间:2013-09-19 18:19:36

标签: ruby visibility method-missing

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函数。你能解释一下吗?


编辑:感谢Eugene的评论。 ruby --version告诉我1.8.7。此外,irb --version是0。9。5(2013年4月5日)。很高兴知道这在我以后的版本中会有所期待。

1 个答案:

答案 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}}这是新的超类。