私は今、「メタプログラミングのRuby」を読んでいて、概念を明確にするためにいくつかのコードを同時に書いています。私はあなたが/単一のモジュールを複数回追加/前置すると、それ以上のすべてのインクルージョンは祖先の鎖の前記モジュールの場所を変更しないことを読んだことがあります。Ruby - 単一モジュール複数回と祖先階層を含む
私は期待していない方法で動作するコードを書きましたが、実際には何が起こっていますか?
module GreatGrandfather; end
module Grandfather
include GreatGrandfather
end
module Father
include Grandfather
prepend GreatGrandfather
end
module Son
include Father
end
Son.ancestors # => [Son, Father, Grandfather, GreatGrandfather]
私はSon.ancestors
を実行すると、子は父、父は祖父を含めるとGreatGrandfatherを付加し、祖先のツリーが[Son, GreatGrandfather, Father, Grandfather]
に設定されますでしょう含まれることを想定しました。明らかにそれは起こらなかった。
息子が父親を含むと、それは父親モジュールを調べ始め、include Grandfather
とprepend GratGrandfather
です。 GreatGrandfatherが含まれているGrandfather
に実際に入って、prepend GreatGrandfather
行しか実行しません(それはすでに祖先に存在するため無視されます)。
真実、私はそれから多くの使い方を得ることはできませんが、モジュール同士がどのように正確に繋がっているかを知ることはできません。
@edit - 私はそれをもう少し試してみましたが、どちらの場合でも私の直感が正しいとは思われません。私は、それが行えると思った2つの方法、命令の後の指示、継承階層の作成についての画像を含んでいます - 画像に現れるように見えるものは、与えられた元の例に反するため、#1も#2も起こっている。私はまだRubyのデフォルトの実装がある
正直言って、ありがとうございます。私はいくつかの情報インフォメーションOPを追加しました - 体重を計ることができますか? – blob
Heh、私はモジュール内のコードをすぐに実行することを完全に無視しているので、実際に自分自身で考え出しました。私はそれを試してきたので、何とかユニット化された定数について不平を言いました。もし私がファイルでそれを実行すると、最初から明確な答えが得られました。ありがとうございました! – blob