2

私はこのようなプログラムを書いています:

module Filter
  def self.included?(klass)
    @count = 0
  end
end

class Object
  include Filter
end

class Person
  def get_count
    puts @count
  end
end

このミックスインがすべてのオブジェクトにアクセス可能であることを期待して、ミキシングフィルターを介してインスタンス変数@countを定義したいと思います。

しかし、私のやり方はうまくいきません。

誰かがこれを達成する方法を教えてもらえますか?

4

2 に答える 2

2

変数を使用せず、属性を使用してください。

module Counter
  attr_accessor :count
end

class Person
  include Counter
end

person = Person.new
person.count = 50
puts person.count

また、に何かを含めないObjectでください。クラスにのみ含めてください。非一般的なメソッドでメインの名前空間を汚染することは悪いことであり、他のクラスでメソッド名の衝突を引き起こし、見つけにくいバグを引き起こす可能性があります。

どこにでもあるのではなく、必要だと思う場所にのみモジュールを含めてください。

于 2012-08-28T12:38:08.423 に答える
0

@ HanXu、MaurícioLinharesのソリューション(およびメインの名前空間を汚染しないという提案)は、理想的な方法です。

ただし、のすべてのインスタンスを本当にObject変更したい場合は、Objectクラスを開いて、探している特定の機能を追加できる可能性があります。

class Object
  attr_accessor :count
end

...

p = Person.new
p.count = 10
puts p.count    # => 10

推奨されていませんが、機能します(いずれの場合も、オブジェクトを開いてモジュールをインクルードします)。

于 2012-08-29T17:26:37.790 に答える