2

method_missingObject.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 --version1.8.7を教えてくれます。また、irb --version0.9.5(05/04/13)です。これが後のバージョンで期待どおりに動作することを知っておくとよいでしょう。

4

1 に答える 1

1

呼び出されるのは のプライベート メソッドではObjectなく、 のモジュール メソッドですKernel同様の質問へ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に移動されました。BasicObject

于 2013-10-11T09:38:52.307 に答える