通常,如何获得对字符串中具有其名称的对象的引用?
更具体地说,我有一个参数名称列表(成员变量-动态构建的,因此我不能直接引用它们)。
每个参数都是一个对象,也具有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会很好地处理这个问题。但是,如果您发现自己进入另一个对象并拉出其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
。请注意,您可以重新打开任何现有类的,并将私有(private)的ivar变成阅读器。由于访问器只是一种方法,因此可以执行
Computer.new(4).send(var_that_evaluates_to_cpus)