2009-07-02 43 views
82

一般來說,如何獲得對名稱爲字符串的對象的引用?獲取實例變量的值,其名稱爲

更具體地說,我有一個參數名稱列表(成員變量 - 動態構建,所以我不能直接引用它們)。

每個參數是一個也有from_s方法的對象。

我想要做類似如下(這當然是不行的...):

define_method(:from_s) do | arg | 
    @ordered_parameter_names.each do | param | 
     instance_eval "field_ref = @#{param}" 
     field_ref.from_s(param) 
    end 
end 

回答

157

最慣用的方式來實現這一目標是:

some_object.instance_variable_get("@#{name}") 

沒有必要使用+intern; Ruby將會很好地處理這個問題。但是,如果您發現自己伸向另一個物體並拔出它的伊娃,那麼破裂封裝的可能性很大。

如果您明確要訪問伊娃,正確的做法是將其設爲訪問者。考慮以下幾點:

class Computer 
    def new(cpus) 
    @cpus = cpus 
    end 
end 

在這種情況下,如果你沒有Computer.new,你將被迫使用instance_variable_get獲得在@cpus。但如果你這樣做,你可能意味着@cpus是公開的。你應該做的是:

class Computer 
    attr_reader :cpus 
end 

現在你可以做Computer.new(4).cpus

請注意,您可以重新打開任何現有的類,併成爲一個私人伊娃到讀者。由於訪問器只是一種方法,你可以做Computer.new(4).send(var_that_evaluates_to_cpus)

7

爲了得到一個實例變量的名稱的實例變量做:

name = "paramName" 
instance_variable_get(("@" + name).intern) 

這將返回實例變量的值@paramName

+0

動態創建一個類時,我有一個實例變量名稱的數組(我需要這個列表,因爲我需要按照一定的順序處理它們)。通過使用這個名字,我想獲得對該變量的引用。 – 2009-07-02 14:44:16

+1

我有一個字符串「paramName」,需要一個參考@參數名稱 – 2009-07-02 14:45:05