一般情况下,如何获取对字符串中名称为的对象的引用?
更具体地说,我有一个参数名称列表(成员变量 - 动态构建,所以我不能直接引用它们。)
每个参数都是一个也有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
答案 0 :(得分:171)
实现这一目标的最惯用方法是:
some_object.instance_variable_get("@#{name}")
无需使用+
或intern
; Ruby会处理这个问题。但是,如果你发现自己正在接触到另一个物体并拔出它的ivar,那么你有很好的机会破坏封装。
如果您明确要访问ivar,正确的做法是使其成为访问者。请考虑以下事项:
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
。
请注意,您可以重新打开任何现有类,并将私有ivar创建到阅读器中。由于访问者只是一种方法,因此您可以执行Computer.new(4).send(var_that_evaluates_to_cpus)
答案 1 :(得分:9)
要从实例变量的名称获取实例变量,请执行以下操作:
name = "paramName"
instance_variable_get(("@" + name).intern)
这将返回实例变量@paramName