9

Ruby on Rails 3.2.2 を使用しています。RoR ActiveSupport::Concern機能を使用して、モジュールを実装し、それをクラスに含めています。included do ... endモジュールが含まれるクラスのクラスコンテキストで実行されるブロック作成コードを内部で使用できるようにします。

私の疑問は次のとおりです。ブロックに含めるべきではないものは何ですか? included do ... endつまり、たとえば、次のことを行うのは「一般的」/「良い」慣行ですか?

module MyModule
  extend ActiveSupport::Concern

  class MyModuleClass
    attr_accessor :attr1, :attr2, :attr3

    def initialize(attrs)
     @attr1 = attrs[:attr1]
     @attr2 = attrs[:attr2]
     @attr3 = attrs[:attr3]
    end
  end

  included do
    @my_module_class = MyModuleClass.new(some_attrs)
  end
end

Moreは、インクルード@my_module_classクラスの属性として使用できる変数になりますMyModule(ところで、そのモジュールでのみ使用することを意図しているため、内部でのみ@my_module_class「表示」したいと思います)? 上記のコードのブロックでインスタンス化しようとしているような状況を処理する方法に関する「高度な」例またはチュートリアルはありますか? 何についてアドバイスしますか?MyModuleincluded do ... end

4

1 に答える 1

2

@my_class は、MyModule ではなく MyClass のインスタンスになります。MyClass のすべてのインスタンスを MyModule のインスタンスにしたい場合は、次のように記述します。

 include MyModule

クラス定義内。

編集前のこの質問の元のバージョンを見れば、私の答えは理にかなっていると思います。

編集1:

あなたの例に追加して、Foo というクラスがあるとしましょう:

class Foo
    include MyModule
end

Foo に関連付けられている MyModuleClass のインスタンスを作成したいのですが、実際には Foo を変更したり、MyModuleClass へのアクセスを許可したりしたくないようです。ハッシュ テーブルを使用することをお勧めします。

module MyModule
    # ...

    @hash = {}
    class << self
        attr_accessor :hash
    end

    included do
        MyModule.hash[self] = MyModuleClass.new(some_attrs)
    end
end

私はそれがうまくいくと思うし、インスタンス変数をFooクラスオブジェクトに追加することを避けます。技術的には、Ruby コードのどの部分でも MyModule.hash にアクセスできますが、ソース コードにコメントを入れて、そうしないように伝え、ハッシュが存在することを宣伝しないようにする必要があります。

于 2012-10-18T15:14:57.017 に答える