根据名称获取实例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
的值