2012-05-05 187 views
0
BasicObject.class_eval do 
    def instance(ins) 
     eval "@#{ins}=#{ins}", binding 
    end 
end 

是否有問題的代碼。我想要它做的是在下面的代碼中,在類Foo中創建一個新的實例變量bar。 運行此代碼後,我能得到什麼:這是爲什麼返回錯誤?

class Foo 
    bar = 3 
end 
Foo.instance(:bar) 

是:

NameError: undefined local variable or method `bar for Foo:Class 
     from /Users/Solomon/Desktop/Ruby/instance.rb:3:in `instance' 
     from /Users/Solomon/Desktop/Ruby/instance.rb:3:in `eval' 
     from /Users/Solomon/Desktop/Ruby/instance.rb:3:in `instance' 

這究竟是爲什麼。

+0

出於同樣的原因在您的上一個問題中給出 - 一旦類聲明已經處理,「bar」不存在。 –

回答

0

這裏有些東西....您已經爲BasicObject定義了一個實例方法instance。然後您在Foo對象上調用此實例方法。 Foo對象是一個類。您尚未爲Foo對象設置任何實例變量。您使用@標誌設置實例變量。 instance方法所做的就是將實例變量@ins設置爲自身。

, binding在這裏不需要,因爲binding是返回當前變量綁定的頂級方法。如果您需要傳遞保存的「環境」,則只需要保存binding。有, binding不會傷害任何東西,但是是多餘的。

BasicObject.class_eval do 
    def instance(ins) 
     eval "@#{ins}= @#{ins}", binding  # @ after the '=' 
    end 
end 



class Foo 
    @bar = 3  # @ here 
end 
Foo.instance(:bar) 
puts Foo.instance_variable_get("@bar") # Shows the instance variable @bar for Foo object 
相關問題