在ruby中迭代地设置数组中的值

时间:2014-03-09 07:57:55

标签: ruby

在ruby中有更简单的方法吗?

ops_schema_name = "ops"
tables.each do |table|
  table.schema_name = ops_schema_name
end

阅读属性时,它是否像tables.collect(&:schema_name)一样简单? 我假设有一个设置者的快捷方式。

2 个答案:

答案 0 :(得分:2)

你可以做到

schema_name_updater = -> table { table.schema_name = 'ops' }
tables.each(&schema_name_updater)

答案 1 :(得分:0)

根据Jörg的好回答,我提出了这个通用解决方案,适用于任何类型的对象和任意数量的属性:

attrs_setter = -> obj, attrs { attrs.each { |k, v| obj.send("#{k}=", v) } }

$> tables.each { |table| attrs_setter.call(table, { :name => 'ops' }) }

$> Obj = Struct.new(:a, :b)
# => Obj
$> objs = Array.new(2) { |i| i = Obj.new('hi', 'there') }
# => [#<struct Obj a="hi", b="there">, #<struct Obj a="hi", b="there">] 
$> objs.each { |obj| attrs_setter.call(obj, { a: 'good', b: 'bye' } ) }
# => [#<struct Obj a="good", b="bye">, #<struct Obj a="good", b="bye">]