将Ruby数组转换为键值对的哈希值,其中值是常量

时间:2011-12-11 16:12:19

标签: ruby arrays hash

我正在使用一个带有一系列布尔开关的Ruby API,类似于:

validate({ :can_foo => true, :can_bar => false, :can_baz => true, ... })

我正在编写一系列测试来验证API的行为是否正常,因此我需要构建许多开关集。继续输入似乎很浪费:foo =>所有的时间都是真的,所以我想我会写一点Ruby ditty来将数组转换为这种结构,例如。

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 / true / false /做假的;我做了很多次,所以lambda看起来很合理)

谢谢,

- 马特

2 个答案:

答案 0 :(得分:4)

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}

答案 1 :(得分:1)

这是一个解决方案:

switches={}
true_vals.each do |v|
    switches[v]=true
end
false_vals.each do |v|
    switches[v]=false
end