Answers:
实现此目的的最惯用的方法是:
some_object.instance_variable_get("@#{name}")
无需使用+
或intern
; Ruby会很好地处理这个问题。但是,如果您发现自己进入另一个对象并拉出它的ivar,则很有可能破坏了封装。
如果您明确想要访问ivar,则正确的做法是使其成为访问器。考虑以下:
class Computer
def new(cpus)
@cpus = cpus
end
end
在这种情况下,如果您这样做了Computer.new
,则将不得不使用instance_variable_get
at @cpus
。但是,如果您这样做,则可能意味着@cpus
要公开。您应该做的是:
class Computer
attr_reader :cpus
end
现在您可以做Computer.new(4).cpus
。
请注意,您可以重新打开任何现有的类,并将私有ivar制成阅读器。由于访问器只是一种方法,因此您可以执行Computer.new(4).send(var_that_evaluates_to_cpus)
要从实例变量的名称获取实例变量,请执行以下操作:
name = "paramName"
instance_variable_get(("@" + name).intern)
这将返回实例变量的值 @paramName
:attr_reader varname
以便随后可以以更简洁,更简洁的方式访问变量。