访问模块实例变量

时间:2015-07-13 11:26:58

标签: ruby module

我试图访问模块方法中的实例变量。

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:你好"。如何初始化@var实例变量以实现此目的?

1 个答案:

答案 0 :(得分:2)

和许多其他人一样,你也对“实例变量”一词感到困惑。它是一个实例变量,好吧,但它不是你想到的实例。

请记住,红宝石中的所有东西都是一个物体。甚至上课本身。

  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)}"

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