2

有没有更直接的方法来做到这一点?

[1, nil, 2, 'a'].all? {|x| x}
4

5 回答 5

6

使用include?并在开头添加“非”:

![1, nil, 2, 'a'].include?(nil)

如果所有元素都不为零,则数组不包含nil. 使用.all?意味着您必须扫描整个数组,.include?一旦找到匹配项就应该停止并且没有调用块的开销;所以,.include?应该更快,但性能差异可能是无关紧要的,除非你有一个庞大的阵列。我会选择最适合你的那个。

于 2011-04-01T23:49:12.467 回答
5

另一种可能性是any?ornone?方法,并使用该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()}

于 2011-04-01T23:50:44.183 回答
4

你在打高尔夫吗?

这就像你会得到的一样简短和直接。就个人而言,我更喜欢稍微冗长的方式:

[...].all? {|x| !x.nil? }
于 2011-04-01T23:49:57.347 回答
0

我想你可以这样做::

!list.any?(&:nil?)

但我发现这比您的原始代码更不直接。但是字符更少,如果你不喜欢块,这会将块隐藏在 &:symbol 中

[嗯,你的原始代码有一个问题,那就是 {|x| x } 对于 nil 和 false 值都评估为 false。如果你真的想要块 {|x| !x.nil?}]

于 2011-04-02T04:33:07.600 回答
0

几乎和 mu 一样太短了,我不认为我的比它更好,但只是另一个变体:

![1, nil, 2, 'a'].index(nil)
于 2011-04-02T04:52:37.230 回答