※ ChatGPTを利用し、要約された質問です(原文:呼ばれているメソッドがおかしくなります)
呼ばれているメソッドがおかしくなる原因とは?
このQ&Aのポイント
Rubyのコードを書いている際、呼ばれているメソッドがおかしくなることがあります。
特に、オブジェクトのメソッドを上書きする際に問題が起きることがあります。
原因は、モジュールのメソッドが継承関係の深い位置に挿入されるためです。
rubyのコードを書いていた時の疑問です。
以下のコードを見てみると、呼ばれているメソッドがおかしくなっているところがあるように見えます。
a = "hoge"
module Mage
def to_s
:fuga
end
end
a.extend(Mage)
a.to_s # => :fuga
a.singleton_class.ancestors # => [#<Class:#<String:0x007fdeea15c4a0>>, Mage, String, Comparable, Object, Kernel, BasicObject]
上のコードはObext#extendでto_sメソッドの挙動を上書きされていますが
継承をたどっていくと、Stringクラスのto_sメソッドではなくMageモジュールのto_sメソッドの方が、深いところに挿入されています。
継承関係と、実際に呼ばれるメソッドに齟齬があるように見えるのですが、これはどういう原因で起こるのでしょうか?
お礼
納得です a.singleton_class.ancestors # => [#<Class:#<String:0x007fdeea15c4a0>>, Mage, String, Comparable, Object, Kernel, BasicObject] となっていますが、Stringのto_sメソッドは #<Class:#<String:0x007fdeea15c4a0>>には存在していなくて Strngクラスの雛形の方にある、ということですね。 言われてみればその通りです。 失礼しました。