我试图访问模块方法中的实例变量。
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实例变量以实现此目的?
答案 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)}"
当然,不可能在一个尚不存在的实例上设置一个实例变量(以这种方式)!根据您的具体情况,可以实施不同的策略。我建议你提出另一个更精确的问题。