In-Depth Ruby:Modules&Include vs.Extend

Rubyは、薄いクラスのようなModuleという構造を提供します。 最初は、Ruby開発者は、ちょうど周りにスローされ、ファイルを整理するために使用されるコードの”迷惑な引き出し”のようなモジュールを見るかもしれませんが、この狂気には方法があります。 RubyクラスClassModuleModuleClassの祖先であるため、これはモジュールをいくつかの点でクラスのように扱うことができることを意味します。

最も重要なのは、Rubyの祖先チェーンがどのように機能するかです。 すべてのOOP言語と同様に、Rubyは継承をサポートしています。 クラスから継承すると、スーパークラスが祖先チェーンに追加されます。 前述のように、配列Class.ancestors

class Foo < BarendFoo.ancestors#=> 

を見つけることができます。Class.ancestors

モジュールをクラスにincludeincludeは単なる継承の形式になり、特別なことはありません。p>

module Barendclass Foo include BarendFoo.ancestors#=> 

BarFooに追加されます。 Barはチェーン内にあるため、モジュールやクラスで定義されているかどうかにかかわらず、チェーン内のその上のメソッドを呼び出すために、そこからsuperを呼び出すこともできます。p>

class Baz def hello p 'world' endendmodule Bar def hello p 'hello' super endendclass Foo < Baz include BarendFoo.new.hello#=> hello world

BarsuperBaz#helloも呼ばれます。 Bazの前にある祖先チェーンにBarが追加されていることは注目に値します。 モジュールが含まれている場合、それは常にクラスを含むものの上に直接追加されます。 これは、複数のモジュールを”逆”の順序で含まれているため、複数のモジュールを追加するときに混乱する可能性があります:p>

class Foo include A include BendFoo.ancestors#=> 

AFooBFooAの前に着陸します。p>

include vs extend

includeextend同じことをしていますが、代わりにメソッドをクラスメソッドとして追加します。ruby2.0+はinclude/extendに加えてprependprependincludeに似ていますが、代わりに継承チェーン内のincludingクラスの前にモジュールを挿入します。Rubyでは、任意のクラスを再オープンしてメソッドを再定義することができます–それらを再定義するのではなく、前に追加されたモジュールを使用してク ここで、prependsuperを使用して元の実装を呼び出すため、メソッドの元の実

コメントを残す

メールアドレスが公開されることはありません。