Ruby 如何通过mixin定义实例变量

Ruby 如何通过mixin定义实例变量,ruby,Ruby,我正在写这样一个程序: module Filter def self.included?(klass) @count = 0 end end class Object include Filter end class Person def get_count puts @count end end 我想通过mixing Filter定义一个实例变量@count,希望所有对象都可以访问这个mixin 然而,我的方法行不通 有谁能告诉我如何做到这一点吗?不要

我正在写这样一个程序:

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

class Object
  include Filter
end

class Person
  def get_count
    puts @count
  end
end
我想通过mixing Filter定义一个实例变量@count,希望所有对象都可以访问这个mixin

然而,我的方法行不通


有谁能告诉我如何做到这一点吗?

不要使用变量,使用属性:

module Counter
  attr_accessor :count
end

class Person
  include Counter
end

person = Person.new
person.count = 50
puts person.count
另外,不要将内容包含到
对象中,只包含在类中。用非通用方法污染主名称空间是不好的,可能会导致其他类中的方法名称冲突,导致难以找到的bug


只包含您认为需要的模块,而不是所有模块。

@HanXu,Maurício Linhares的解决方案(以及不污染主名称空间的建议)是理想的方法

但是,如果您确实希望更改
对象的每个实例
,那么您可能只需打开对象类并添加所需的特定功能:

class Object
  attr_accessor :count
end

...

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

不推荐使用,但可以使用(在任何情况下,您现在正在打开对象以包含模块)。

您希望所有对象的变量都相同,还是希望所有对象都使用此变量?@MaurícioLinhares,我希望所有对象都使用此变量,不一定有相同的价值。我帖子中的程序只是一个例子。事实上,我想为每个对象添加一个方法,所以我认为在对象中包含模块是一个更好的主意。好的,我想我应该接受你的建议,重写我的程序。非常感谢大家!