我有一个名称/值对的散列:
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)
但这不起作用
答案 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"