我正在编写这样的程序:
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。
但是,我的方法行不通。
谁能告诉我如何实现这一目标?
我正在编写这样的程序:
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。
但是,我的方法行不通。
谁能告诉我如何实现这一目标?
不要使用变量,使用属性:
module Counter
attr_accessor :count
end
class Person
include Counter
end
person = Person.new
person.count = 50
puts person.count
另外,不要将内容Object
包含在 中,仅包含在您的类中。使用非通用方法污染主命名空间是不好的,并且可能导致其他类中的方法名称冲突,从而导致难以发现的错误。
只包含您认为需要的模块,而不是任何地方。
@HanXu,Maurício Linhares 的解决方案(以及不污染主命名空间的建议)是理想的选择。
但是,如果您真的希望更改 的每个实例Object
,那么您可能只需打开 Object 类并添加您正在寻找的特定功能:
class Object
attr_accessor :count
end
...
p = Person.new
p.count = 10
puts p.count # => 10
不推荐,但可以使用(无论如何,您现在正在打开 Object 以包含该模块。)