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

标签 ruby arrays hash

我正在使用一个 Ruby API,它采用一系列 bool 开关,类似于:

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/true/false/来做假的;我已经做了很多很多次了,所以 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}

关于ruby - 将 Ruby 数组转换为键值对的哈希值,其中值是常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8465422/

相关文章:

javascript - 如何对文件夹树进行排序

java - Gui 中的数组递增

arrays - 哈希数组之间的交集,但返回完整的哈希

PHP:反向唯一哈希

c - 在 C 中确定性地生成强力排列

ruby-on-rails - 用任意名称定义方法

Ruby isPrime 方法

ruby-on-rails - Ruby on Rails 连接到服务器问题

mysql - 通过数据库序列化列进行搜索

c++ - 将对象数组、对象的数量和所需的术语传递给函数