こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

呼ばれているメソッドがおかしくなります

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メソッドの方が、深いところに挿入されています。
継承関係と、実際に呼ばれるメソッドに齟齬があるように見えるのですが、これはどういう原因で起こるのでしょうか?

投稿日時 - 2016-05-13 14:06:49

QNo.9171908

暇なときに回答ください

質問者が選んだベストアンサー

自分が分かってないだけならごめんなさい、
特異クラス、Mage、Stringの順番ですよね?
Mageモジュールの方が浅いですよね?

投稿日時 - 2016-05-13 14:30:16

お礼

納得です
a.singleton_class.ancestors # => [#<Class:#<String:0x007fdeea15c4a0>>, Mage, String, Comparable, Object, Kernel, BasicObject]
となっていますが、Stringのto_sメソッドは
#<Class:#<String:0x007fdeea15c4a0>>には存在していなくて
Strngクラスの雛形の方にある、ということですね。
言われてみればその通りです。
失礼しました。

投稿日時 - 2016-05-13 14:50:39

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問