动态匿名模块中的Ruby类变量

时间:2015-07-13 13:22:42

标签: ruby module

我正在创建一个匿名模块,因为我需要它是动态的,但是使用类似下面示例中的类变量并不起作用。我有这段代码:

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变量?

2 个答案:

答案 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