动态设置Ruby对象的属性

动态设置Ruby对象的属性,ruby,dynamic,Ruby,Dynamic,如何在Ruby中动态设置对象属性 def set_property(obj, prop_name, prop_value) #need to do something like > obj.prop_name = prop_value #we can use eval but I'll prefer a faster/cleaner alternative: eval "obj.#{prop_name} = #{prop_value}" end 使用: Obj

如何在Ruby中动态设置对象属性

def set_property(obj, prop_name, prop_value)
    #need to do something like > obj.prop_name = prop_value 

    #we can use eval but I'll prefer a faster/cleaner alternative:
    eval "obj.#{prop_name} = #{prop_value}"
end
使用:

Object#instance_variable_set()
是您正在寻找的,并且是您想要的更干净的版本

例如:

your_object = Object.new
your_object.instance_variable_set(:@attribute, 'value')
your_object
# => <Object:0x007fabda110408 @attribute="value">
your_object=object.new
您的对象。实例变量集(:@attribute,“value”)
你的目标
# => 

关于

的Ruby文档如果环境允许使用实例方法,那么以下内容并不过分冒犯:

class P00t
  attr_reader :w00t

  def set_property(name, value)
    prop_name = "@#{name}".to_sym # you need the property name, prefixed with a '@', as a symbol
    self.instance_variable_set(prop_name, value)
  end
end
用法:

p = P00t.new
p.set_property('w00t', 'jeremy')
这个答案()对我有用:

Object.send(attribute + '=', value)
属性
必须是
字符串
。因此,如果您正在通过一个
符号
数组进行迭代(就像我一样),您可以使用
来_s

Object.send(attribute.to_s + '=', value) 

如果您使用1.9.2,您应该调用public_send而不是send as send,因为send也可以调用对象的私有方法参见[这对动态设置属性不起作用。执行
obj.send(“foo=,“bar”)
将中断,除非已经定义了
foo=
方法(通过属性访问器或显式方法定义).send所做的一切就是使用指定的参数调用现有的方法。请参阅:如果
属性名
是嵌套键怎么办?
foo.bar
处于一对多关系中,例如:Posts有许多注释,如何动态地将Dependent实例推送到独立实例?通常,我们在rails上会这样做:
@post.com假设OP真的想设置一个实例变量而不是调用mutator方法。问题似乎将两者混为一谈,但示例代码至少在调用mutator方法。@mu太短了,当然,但是
instance\u variable\u set()
确实为在运行时确定的变量名设置了一个实例变量。从这个意义上说,它与问题中的效果相同,但更清晰/更清晰。不一定。直接设置实例变量和调用mutator方法并不总是一回事;该方法可以改变/检查传入值,t方法可能会将值存储在其他地方,甚至在mutator后面可能没有实例变量,…这就是我要说的。
Object.send(attribute.to_s + '=', value)