2009-07-02 46 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