访问模块实例变量

Access to module instance variable

我正在尝试访问模块方法中的实例变量。

module Filter
  def self.included(target)
    puts "INCLUDED: #{@var}"
    target.instance_variable_set(:@var, @var) # doesn't seem to work
  end

  def self.var=(var)
    @var = var
  end

  def self.var
    @var
  end

  def hello
    @var
  end

end

f = Filter
f.var = "hello"

puts "SET: #{f.var}"

class Main
  include Filter
end

m = Main.new

puts "HELLO: #{m.hello}"

它产生这个输出:

ruby test2.rb
SET: hello
INCLUDED: hello
HELLO: 

最后一行"HELLO:"需要输出"HELLO: hello"。如何初始化 @var 实例变量以实现此目的?

和许多其他人一样,您也对此处的 "instance variable" 一词感到困惑。它是一个实例变量,好吧,但它不是你想的实例。

请记住,ruby 中的所有内容都是对象。甚至 类 他们自己。

  def self.included(target)
    puts "INCLUDED: #{@var}"
    target.instance_variable_set(:@var, @var) # doesn't seem to work
  end

所以在这里您要在 target 上设置实例变量(最有可能是 Class)。然而,您正在尝试从 target 实例 中读取。

m = Main.new

puts "HELLO: #{m.hello}"

这是您的变量所在的位置:

puts "The right HELLO: #{Main.instance_variable_get(:@var)}"

当然,不可能在尚不存在的实例上设置实例变量(以这种方式)!根据您的具体需求,可以实施不同的策略。我建议你再问一个更精致的问题。