通常,如何获得对字符串中具有其名称的对象的引用?

更具体地说,我有一个参数名称列表(成员变量-动态构建的,因此我不能直接引用它们)。

每个参数都是一个对象,也具有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)

10-05 21:13