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,希望所有对象都可以访问这个mixin。

但是,我的方法行不通。

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

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ício Linhares 的解决方案(以及不污染主命名空间的建议)是理想的选择。

但是,如果您真的希望更改 的每个实例Object,那么您可能只需打开 Object 类并添加您正在寻找的特定功能:

class Object
  attr_accessor :count
end

...

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

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

于 2012-08-29T17:26:37.790 回答