私はRubyでメタプログラミングを学んでおり、method_missingとdefine_methodで欠落しているメソッドを定義しようとしています。私は予想外の動作をしており、誰かがこれを説明できるかどうか疑問に思っています。ここに私のクラスである:今Ruby:putsがto_aryを呼び出すのはなぜですか?
class X
def method_missing(m, *args, &block)
puts "method #{m} not found. Defining it."
self.class.send :define_method, m do
puts "hi from method #{m}"
end
puts "defined method #{m}"
end
end
、このコード:なぜRubyが呼んでいる:私は得ることはありません何
がmethod some_method not found. Defining it.
defined method some_method
hi from method some_method
method to_ary not found. Defining it.
defined method to_ary
#<X:0x007fcbc38e5030>
最後の部分である:
x = X.new
x.some_method
puts
x.some_method
puts
puts x
は出力を生成しますto_aryを呼び出して呼び出しますか?なぜRubyはオブジェクトを配列に変換して印刷するのですか?
私の周りGoogleで検索し、これらの関連リンクを見つけた:
- http://tenderlovemaking.com/2011/06/28/til-its-ok-to-return-nil-from-to_ary/
- http://yehudakatz.com/2010/01/02/the-craziest-fing-bug-ive-ever-seen/
これらも具体的プットがto_aryを呼ぶだろう理由についてmethod_missingとto_ary落とし穴についての話ではなく、 。
to_sを定義したときの動作は変更されません。
def to_s
"I'm an instance of X"
end
"プットのX" の出力は、次のとおりです
method to_ary not found. Defining it.
defined method to_ary
I'm an instance of X
感謝を。私はエッセンスが "to_ary内部使用法は本当にRubyのドキュメントではよく文書化されていない"と思う:)私はちょうどIO.putsドキュメントを読む、彼らは明示的にto_aryを言及していない、これは私が考えるより明らかにする必要があります。 "Rubyプログラミング言語"の本を指してくれてありがとう、それをチェックするかもしれない。 –