我正在创建一个匿名模块,因为我需要它是动态的,但是使用类似下面示例中的类变量并不起作用。我有这段代码:
class Filter
def self.mod(var)
# Creating anonymous module
m = Module.new do
def hello
puts @var
end
def self.var=(var)
@@var = var
end
def self.var
@@var
end
end
# Setting the class variable
m.var = var
m
end
end
f1 = Filter.mod("hello")
puts f1.var # => hello
f2 = Filter.mod("goodbye")
puts f2.var # => goodbye
puts f1.var # => goodbye
为什么f1在分配给f2时会改变?我需要每个模块来维护自己的变量值。有没有办法用匿名/动态模块来规避这个?
如果我在一个类中包含Filter:
class Main
include Filter.mod("hello")
end
m = Main.new
puts m.hello # => nil
如何访问@var变量?
答案 0 :(得分:1)
@@
在Filter
上定义了一个类变量,而不是您期望的新Module
上的类变量。你可以看到它:
puts Filter.class_variables.inspect
# [:@@var]
这只存在一次,并且会在@@var
范围内的每个Filter
引用中写入。
您真正想要的是每个Module.new
上的类实例变量,您只使用一个@
。这会在@var
类的新实例上定义Module
。
def self.var=(var)
@var = var
end
def self.var
@var
end
# ...
puts f1.class
# Module
puts f1.instance_variables.inspect
# [:@var]
puts f2.var
# goodbye
puts f1.var
# hello
答案 1 :(得分:0)
因为您分配给@@var
这是一个类变量。尝试将其更改为@var
。