根据名称获取实例variables的值

一般来说,我怎么能得到一个对象的名称,我有一个string?

更具体地说,我有一个参数名称的列表(成员variables – dynamic构build,所以我不能直接引用它们)。

每个参数都是一个也有一个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 

达到这个最习惯的方式是:

 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)

从一个实例variables的名字得到一个实例variables:

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

这将返回实例variables@paramName的值