首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Ruby数组转换为键值对的哈希值,其中值为常量

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

Stack Overflow用户
提问于 2011-12-12 00:12:19
回答 2查看 1.6K关注 0票数 2

我正在使用一个Ruby API,它接受一系列布尔开关,大致如下:

代码语言:javascript
复制
validate({ :can_foo => true, :can_bar => false, :can_baz => true, ... })

我正在编写一系列测试,以验证API是否正常运行,因此我需要构造许多开关集。继续输入:foo Ruby true似乎很浪费,所以我想我应该写一个小=>来将数组转换成这种结构,例如

代码语言:javascript
复制
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 /才能做假的;而且我做了很多次,所以λ看起来是合理的)

谢谢,

--哑光

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-12 02:17:47

代码语言:javascript
复制
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}
票数 4
EN

Stack Overflow用户

发布于 2011-12-12 00:21:58

这里有一个解决方案:

代码语言:javascript
复制
switches={}
true_vals.each do |v|
    switches[v]=true
end
false_vals.each do |v|
    switches[v]=false
end
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8465422

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档