ルビーで。モジュールを別のクラスに含めることができ、メソッドはそのクラスのインスタンスで使用できます。Extend も同様ですが、メソッドがクラス メソッドとしてそのクラスに追加される点が異なります。詳細はこちらまたはこちら。
Prependは 2.0 の新機能です。「モジュールのメソッドをクラスのメソッドよりも優先したい場合があります。このタスクを達成するための解決策は、alias_method_chain のようにいくつかありますが、それは何よりもハックであり、実際には安全ではありません。」-- つまり、含めるメソッドをクラス内のメソッドの前に配置して、クラスsuper
内の元のメソッドを呼び出すために使用できるようにする場合があります。
これらのリンクには両方とも詳細な例がありますので、必ず確認してください。しかし、何が含まれていて、先頭に追加され、拡張されているのでしょうか? インクルード/拡張/プリペンドするモジュールでは、これらの関数を定義できます。実際のインクルード/拡張/プリペンドが発生すると、obj
拡張するクラスに設定されたパラメーターでこのメソッドが呼び出されます。これは、たとえば、クラスにメソッドだけを追加するのではなく、クラス変数やインスタンス変数などをクラスに追加したり、値を初期化したりしたい場合に便利です...無限の可能性.
例
コメント、投稿、画像など、大量のモデルがあるとします。たとえば、「いいね」機能などの機能を実装するために同じコードをコピー アンド ペーストする代わりに、このようなものを作成できます。 :
module Likable
def self.included(obj)
obj.instance_variable_set(:@like_count, 0)
end
end
class Comment
include Likable
end
class Picture
include Likable
end
ご覧のとおり、これにより、呼び出された新しいインスタンス変数が自動的like_count
に 0 に設定されます。もちろん、さらにコードを追加しますが、本質はここにあります。機能の一部を再利用可能なモジュールに抽出し、後でモジュールに追加できます。いくつかの異なるクラス。これは、単一のクラスに機能を追加するだけの場合でも使用されることがあります。これの利点は、特定の機能が別のクラスに抽出され、他の機能と混合した場合よりもコードを理解し、微調整することがはるかに簡単になるためです。 .