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)。
- instance_variable_get("@name")是否返回变量的值?我需要一个实际物体的参考。我最终重写了,所以我把参数本身放入了数组中,而不是用多个变量+一个按我想要的顺序排列名称的数组(设计决定是每次通过搜索数组来访问变量,还是用一个附加的数组来优化变量,这些数组的名称只在需要时使用)
- 否:instance_variable_get("@name")返回实际对象。
- 把死线揭开一点。完整的例子是:class computer attr_read:cpus def new(cpus)@cpus=cpus end end?
- "但是,如果您发现自己接触到另一个对象并拉出它的ivar,那么很有可能您破坏了封装。"我们如何突破另一个物体的ivar?.
要从实例变量的名称中获取实例变量,请执行以下操作:
1 2
| name ="paramName"
instance_variable_get(("@" + name).intern) |
这将返回实例变量EDOCX1的值〔0〕。
- 动态创建类时,我有一个实例变量名数组(我需要这个列表,因为我需要按一定的顺序处理它们)。通过使用这个名称,我想获得对变量的引用。
- 我有一个字符串"paramname",需要对@paramname的引用
- 好啊。我建议你编辑你的问题,准确说出这两条评论。
- 此外,这与反序列化无关。更好的标题可能是"根据实例变量的名称获取其值"或其他内容。
- 您总是可以做一个模块并添加:attr_reader varname,这样您就可以以一种更干净、更不冗长的方式访问变量。