访问模块实例变量
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)}"
当然,不可能在尚不存在的实例上设置实例变量(以这种方式)!根据您的具体需求,可以实施不同的策略。我建议你再问一个更精致的问题。
我正在尝试访问模块方法中的实例变量。
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)}"
当然,不可能在尚不存在的实例上设置实例变量(以这种方式)!根据您的具体需求,可以实施不同的策略。我建议你再问一个更精致的问题。