私はクラスBase
と、Base
を継承する2つのクラスDerived
とDerived2
を持っています。それぞれには、関数foo
が定義されています。Rubyクラス階層における `prepend`の振る舞い
私はモジュールGen
も持っています。これはprepend
-Base
です。また、prepend
-Derived2
になりますが、Derived
にはなりません。
IはDerived2
のインスタンスにfoo
を呼び出すとGen
モジュールのみprepend
もBase
になくDerived2
に-edたかのように、結果です。これは期待される行動ですか?ここで
は、上記のシナリオのためのコードです:
module Gen
def foo
val = super
'[' + val + ']'
end
end
class Base
prepend Gen
def foo
"from Base"
end
end
class Derived < Base
def foo
val = super
val + "from Derived"
end
end
class Derived2 < Base
prepend Gen
def foo
val = super
val + "from Derived"
end
end
Base.new.foo # => "[from Base]"
Derived.new.foo # => "[from Base]from Derived"
Derived2.new.foo # => "[from Base]from Derived"
Iを出力する上記の文の最後の期待:あなたが理解するため
[[from Base]from Derived]
'prepend'が動作する方法を知っています。しかし、先祖の鎖は、あなたが上に印刷したものにはならなかった。 1. 'Base.ancestors#=> [Gen、Base、Object、Kernel、BasicObject]' 2. Derived.ancestors#=> [Derived、Gen、Base、Object、Kernel、BasicObject] ' 3。 'Derived2.ancestors#=> [Derived2、Gen、Base、Object、Kernel、BasicObject]' 私はRuby 2.2.4を使用しています。 – CppNoob
@CppNoobがアップデートを追加しました。 – ndn
この動作の変更がどのバージョンで有効になったのか知っていますか? – CppNoob