我正在使用一个Ruby API,它接受一系列布尔开关,类似于:
validate({ :can_foo => true, :can_bar => false, :can_baz => true, ... })
我正在编写一系列测试来验证API是否正常工作,因此我需要构造许多开关集。一直输入:foo => true似乎很浪费,所以我想我应该写一点Ruby小曲来将数组转换为这种结构,例如
true_vals = %w( these are my true items )
false_vals = %w( these are my false items )
convert = lambda{ |arr, truthiness| arr.inject({}){ |res, key| res.update(key=>truthiness) } }
falsify = lambda{ |arr| convert.call(arr, false) }
truthify = lambda{ |arr| convert.call(arr, true) }
validate( truthify.call(true_vals).merge( falsify.call(false_vals) ) )
这看起来比简单地输入一个长列表:sym => [true|false]对更好吗?有更好的方法吗?
(我开始与true_vals.inject({}){|res, key| res.update(key=>true)},但感觉不够干;我需要复制粘贴&S/真/假/做假的;我做了很多很多次所以lambda看起来很合理)
谢谢,
——马特
cs = { true => [:y, :yes],
false => [:n, :no] }
Hash[cs.map{ |k, vs| vs.map{ |v| [v, k] } }.flatten(1)]
#=> {:y=>true, :yes=>true, :no=>false, :n=>false}
这里有一个解决方案:
switches={}
true_vals.each do |v|
switches[v]=true
end
false_vals.each do |v|
switches[v]=false
end