根据名称获取实例变量的值
一般来说,我怎样才能得到一个字符串中对象名称的引用?
更具体地说,我有一个参数名称列表(成员变量 - 动态构建,所以我不能直接引用它们)。
每个参数都是一个也具有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)
要从实例变量的名称中获取实例变量,请执行以下操作:
name = "paramName"
instance_variable_get(("@" + name).intern)
这将返回实例变量@paramName
的值
上一篇: Get the value of an instance variable given its name
下一篇: Why use Ruby's attr