有没有一种很好的方法(一行)在ruby中编写一个散列,只有在满足条件的情况下才有一些条目?我想到了

{:a => 'a', :b => ('b' if condition)}

但如果条件不满足,剩下:b == nil个.我意识到这可以很容易地在两行左右的时间内完成,但在一行中就更好了(例如,当将哈希传递给函数时).

我是不是错过了ruby的另一个惊人功能

推荐答案

UPDATE Ruby 2.4+

自ruby 2.4.0以来,您可以使用compact方法:

{ a: 'a', b: ('b' if cond) }.compact

Original answer (Ruby 1.9.2)

可以先创建key=>;的散列;如果不满足条件,则为nil,然后删除值为nil的对.例如:

{ :a => 'a', :b => ('b' if cond) }.delete_if{ |k,v| v.nil? }

yield 率,对于cond==true:

{:b=>"b", :a=>"a"}

对于cond==false

{:a=>"a"} 

UPDATE for ruby 1.9.3

这是等效的——更加简洁,使用ruby 1.9.3表示法:

{ a: 'a', b: ('b' if cond) }.reject{ |k,v| v.nil? }

Ruby相关问答推荐

判断数组中的字符串是否包含另一个数组中的子字符串

使用 Ruby,是否可以将 BigDecimal("1") / BigDecimal("3") 打印为 0.3333333333333... 到任意长度?

字符串长度多显示一个字符 - ruby

将数组转换 for each 元素的嵌套哈希

each_with_index_do 从 1 开始索引

如何从 Ruby 中的线程返回值?

在一组字符串中找到最长的公共起始子字符串

Coffeescript 中等效的 Ruby .times

从Electron邮件中删除签名和回复

如何在 Ruby 符号中转义破折号-?

通过 x 个字符在 Ruby 中获取子字符串

Ruby 1.9:如何正确大写和小写多字节字符串?

如何在 Ruby 中获取命名空间中的所有类名?

to_proc 方法是什么意思?

错误数量的参数(1 代表 0)在 Ruby 中是什么意思?

如何在 Ruby 中获取堆栈跟踪对象?

在 Ruby 中获取用户主目录的跨平台方法?

未加载库:/opt/local/lib/libssl.1.0.0.dylib (LoadError)

Ruby:捕获异常后继续循环

如何在Ruby中将字符串拆分为仅具有给定字符的两部分?