如何通过mixin定义实例变量

时间:2012-08-28 12:13:19

标签: 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

我想通过混合Filter来定义一个实例变量@count,希望所有Object都可以访问这个mixin。

然而,我的方式不起作用。

谁能告诉我如何实现这个目标?

2 个答案:

答案 0 :(得分:2)

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

module Counter
  attr_accessor :count
end

class Person
  include Counter
end

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

此外,请勿在{{1​​}}中添加内容,仅包括在您的课程中。使用非通用方法对主命名空间进行污染很糟糕,并且可能导致其他类中的方法名称冲突,从而导致难以发现的错误。

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

答案 1 :(得分:0)

@HanXu,来自MaurícioLinhares的解决方案(以及不污染主命名空间的建议)是理想的方式。

但是,如果您真的希望更改Object的每个实例,那么您可以只打开Object类并添加您要查找的特定功能: / p>

class Object
  attr_accessor :count
end

...

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

不推荐,但可以使用(无论如何,您现在打开Object以包含模块。)