2015-07-13 254 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