2015-07-13 263 views
0

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

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实例变量来实现这一点?

回答

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

当然,这是不可能对尚不存在的实例设置(以这种方式)的实例变量!根据你究竟在做什么,可以实施不同的策略。我建议你问另一个更精炼的问题。

+0

谢谢,是的,这有点令人困惑。当我调用m.hello时,我只需要能够访问@var,这是从模块中包含的方法。有任何想法吗? – Vidar

+0

@Vidar:这个选项 - 'def hello; self.class.instance_variable_get(:@ VAR);结束' –

+0

和平与爱:)工作。谢谢!尽管如此,仍然有点困惑... – Vidar