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