关于ruby:获取给定名称的实例变量的值

Get the value of an instance variable given its name

一般来说,如何获取对字符串中名称为的对象的引用?

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

每个参数都是一个对象,它也有一个from_s方法。

我想做如下的事情(当然这不管用…):

1
2
3
4
5
6
define_method(:from_s) do | arg |
    @ordered_parameter_names.each do | param |
        instance_eval"field_ref = @#{param}"
        field_ref.from_s(param)
    end
end


实现这一点的最惯用方法是:

1
some_object.instance_variable_get("@#{name}")

不需要使用+intern;Ruby可以很好地处理这个问题。但是,如果您发现自己接触到另一个对象并拉出它的ivar,那么很有可能您已经破坏了封装。

如果您明确地想要访问一个IVAR,正确的做法是使它成为一个访问器。考虑以下内容:

1
2
3
4
5
class Computer
  def new(cpus)
    @cpus = cpus
  end
end

在这种情况下,如果你做了Computer.new,你将被迫使用instance_variable_get@cpus。但是,如果你这样做,你可能是想让@cpus公开。你应该做的是:

1
2
3
class Computer
  attr_reader :cpus
end

现在你可以做Computer.new(4).cpus

请注意,您可以重新打开任何现有的类,并将一个私有的ivar转换为一个读卡器。因为访问器只是一个方法,所以可以执行Computer.new(4).send(var_that_evaluates_to_cpus)


要从实例变量的名称中获取实例变量,请执行以下操作:

1
2
name ="paramName"
instance_variable_get(("@" + name).intern)

这将返回实例变量EDOCX1的值〔0〕。