0

我有一个名称/值对的哈希:

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 是并且 attr2 是字符串..所以我不能做类似的事情thing."attr1"

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

4

3 回答 3

4

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

于 2013-11-05T23:58:17.790 回答
1

您需要调用 setter 方法,对于被调用的属性,该方法namename=. 按照您的示例:

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

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

attr_hash.each do |k,v|
  setter = "#{k}="
  thing.send(setter, v) if thing.respond_to?(setter)
end
于 2013-11-05T23:59:09.730 回答
0

OpenStruct为您完成。

require 'ostruct'
attr_hash = {"attr1"=>"val1", "attr2"=>"val2"}
d = OpenStruct.new(attr_hash)
p d.attr1 #=> "val1"
于 2013-11-06T00:21:43.030 回答