有更直接的方法吗?
[1, nil, 2, 'a'].all? {|x| x}
答案 0 :(得分:6)
使用include?
并在开头添加“not”:
![1, nil, 2, 'a'].include?(nil)
如果所有元素都是非零,则数组不包含nil
。使用.all?
意味着您必须扫描整个数组,.include?
应该在找到匹配时立即停止,并且没有调用块的开销;所以,.include?
应该更快,但性能差异可能会非常相关,除非你有一个庞大的阵列。我会选择最适合你的那个。
答案 1 :(得分:5)
另一种可能性是any?
或none?
方法,并使用nil?
方法:
irb(main):005:0> [1, nil, 2, 'a'].any?(&:nil?)
=> true
irb(main):006:0> [1, nil, 2, 'a'].none?(&:nil?)
=> false
&:foo
语法可以替换以下内容:list.each() {|x| x.foo()}
答案 2 :(得分:4)
你在打高尔夫吗?
这就像你要得到的一样简短直接。就个人而言,我更喜欢一种稍微冗长的方式:
[...].all? {|x| !x.nil? }
答案 3 :(得分:0)
我想你可以做::
!list.any?(&:nil?)
但我发现它不如原始代码那么直接。但是,如果您不喜欢块,则会隐藏&符号
中的块[嗯,你原来的代码有一个问题,那就是{| x | x}对于nil和false值都计算为false。如果你真的想要块{| x | !x.nil?}]
答案 4 :(得分:0)
几乎与mu太短相同,我认为我没有比它更好,但只是另一种变体:
![1, nil, 2, 'a'].index(nil)