Rubyは、薄いクラスのようなModule
という構造を提供します。 最初は、Ruby開発者は、ちょうど周りにスローされ、ファイルを整理するために使用されるコードの”迷惑な引き出し”のようなモジュールを見るかもしれませんが、この狂気には方法があります。 RubyクラスClass
Module
Module
Class
の祖先であるため、これはモジュールをいくつかの点でクラスのように扱うことができることを意味します。
最も重要なのは、Rubyの祖先チェーンがどのように機能するかです。 すべてのOOP言語と同様に、Rubyは継承をサポートしています。 クラスから継承すると、スーパークラスが祖先チェーンに追加されます。 前述のように、配列Class.ancestors
class Foo < BarendFoo.ancestors#=>
を見つけることができます。Class.ancestors
。
モジュールをクラスにinclude
include
は単なる継承の形式になり、特別なことはありません。p>
module Barendclass Foo include BarendFoo.ancestors#=>
Bar
Foo
に追加されます。 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
Bar
super
Baz#hello
も呼ばれます。 Bazの前にある祖先チェーンにBar
が追加されていることは注目に値します。 モジュールが含まれている場合、それは常にクラスを含むものの上に直接追加されます。 これは、複数のモジュールを”逆”の順序で含まれているため、複数のモジュールを追加するときに混乱する可能性があります:p>
class Foo include A include BendFoo.ancestors#=>
A
Foo
B
Foo
A
の前に着陸します。p>
include vs extend
include
extend
同じことをしていますが、代わりにメソッドをクラスメソッドとして追加します。ruby2.0+はinclude/extendに加えてprepend
prepend
include
に似ていますが、代わりに継承チェーン内のincludingクラスの前にモジュールを挿入します。Rubyでは、任意のクラスを再オープンしてメソッドを再定義することができます–それらを再定義するのではなく、前に追加されたモジュールを使用してク ここで、prepend
super
を使用して元の実装を呼び出すため、メソッドの元の実