0

機能の違いと使用法について、以下の 3 つの方法を理解するのを手伝ってくれる人はいますか?

  • Module#included : mod.include(other)はother.include(mod)の後に呼び出されます

  • Module#extended : mod.extended(obj)はobj.extend(mod) の後に呼び出されます

  • Module# prepended : mod.prepended(other)はother.prepend(mod)の後に呼び出されます

上記の3つを比較して理解するために、1つの例を使用できますか?

ありがとう

4

2 に答える 2

1

ルビーで。モジュールを別のクラスに含めることができ、メソッドはそのクラスのインスタンスで使用できます。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 に設定されます。もちろん、さらにコードを追加しますが、本質はここにあります。機能の一部を再利用可能なモジュールに抽出し、後でモジュールに追加できます。いくつかの異なるクラス。これは、単一のクラスに機能を追加するだけの場合でも使用されることがあります。これの利点は、特定の機能が別のクラスに抽出され、他の機能と混合した場合よりもコードを理解し、微調整することがはるかに簡単になるためです。 .

于 2013-03-13T14:18:17.253 に答える
1

Module#prependedここでは、Ruby 2.0 の別の新機能とともに詳しく説明されています。

Module#includedModule#extended同様に機能しincludeますextend

Rails プロジェクトで使用される一般的なパターンを次に示します。

module Talker

  def self.included(base)
    base.extend ClassMethods
  end

  module ClassMethods
    def say(*args)
      args.each do |arg|
        method_name = ("say_" + arg.to_s).to_sym
        send :define_method, method_name do
          puts arg
        end
      end
    end
  end

end

includedはイベントのフック ( onとinclude同じ) で、モジュールが別のクラスにインクルードされたときに呼び出されます。extendedextendTalker

この機能により、このパターンの代わりに元のクラスを拡張できます。

class Original
  include Talker
  extend Talker::ClassMethods
  ...
end
于 2013-03-13T18:15:36.503 に答える