使用字符串作为Ruby中的属性设置器动态分配属性

时间:2013-11-05 23:56:45

标签: ruby methods attr-accessor

我有一个名称/值对的散列:

attr_hash = {"attr1"=>"val1","attr2=>"val2"}

我想循环遍历这些值中的每一个并将它们分配给一个对象,如下所示:

thing = Thing.new
attr_hash.each do |k,v|
  thing.k = v
end

class Thing
   attr_accessor :attr1, :attr2
end

问题当然是attr1 is和attr2是字符串..所以我不能做像thing."attr1"

这样的事情

我尝试过: thing.send(k,v)但这不起作用

3 个答案:

答案 0 :(得分:4)

改为使用thing.send("#{k}=", v)

答案 1 :(得分:1)

您需要调用setter方法,该方法对于名为name的属性为name=。 以下是您的示例:

attr_hash.each do |k,v|
  thing.send("#{k}=", v)
end

此外,如果此哈希以某种方式来自用户,则在使用respond_to?调用之前测试setter是否存在可能是个好主意:

attr_hash.each do |k,v|
  setter = "#{k}="
  thing.send(setter, v) if thing.respond_to?(setter)
end

答案 2 :(得分:0)

OpenStruct为你做到了。

require 'ostruct'
attr_hash = {"attr1"=>"val1", "attr2"=>"val2"}
d = OpenStruct.new(attr_hash)
p d.attr1 #=> "val1"