2

これを行うより直接的な方法はありますか?

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

5 に答える 5

6

include?先頭に「not」を使用して追加します。

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

すべての要素が非 nil の場合、配列には が含まれませんnil。使用.all?すると、配列全体をスキャンする.include?必要があり、一致が見つかったらすぐに停止する必要があり、ブロックを呼び出すオーバーヘッドはありません。そのため、より高速に.include?なるはずですが、大規模な配列がない限り、パフォーマンスの違いはおそらくほとんど関係ありません. 私はあなたに最も適した方を選びます。

于 2011-04-01T23:49:12.467 に答える
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()}

于 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 に答える