Какой самый короткий способ увидеть, если все элементы не равны нулю? - PullRequest
2 голосов
/ 02 апреля 2011

Есть ли более прямой способ сделать это?

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

Ответы [ 5 ]

6 голосов
/ 02 апреля 2011

Используйте include? и добавьте «не» в начало:

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

Если все элементы не равны нулю, массив не включает nil. Использование .all? означает, что вам нужно сканировать весь массив, .include? должен прекратиться, как только он найдет совпадение, и нет никаких накладных расходов на вызов блока; Итак, .include? должно быть быстрее, но различия в производительности, вероятно, будут довольно несущественными, если у вас нет массивного массива. Я бы пошел с тем, что лучше для вас читает.

5 голосов
/ 02 апреля 2011

Другая возможность - это методы 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()}

4 голосов
/ 02 апреля 2011

Вы играете в гольф?

Это так коротко и прямо, как ты собираешься получить. Лично я предпочел бы немного более многословный способ:

[...].all? {|x| !x.nil? }
0 голосов
/ 02 апреля 2011

Почти то же самое, что mu слишком короткий, и я не думаю, что мой лучше, чем он, но просто другой вариант:

![1, nil, 2, 'a'].index(nil)
0 голосов
/ 02 апреля 2011

Полагаю, вы могли бы сделать:

!list.any?(&:nil?)

Но я считаю, что это менее прямое, чем ваш исходный код.Однако меньше символов, и если вам не нравятся блоки, этот блок скрывается в символе &:

[Ну, у вашего исходного кода есть проблема, которая заключается в том, что {| x |x} оценивается как ложное как для nil, так и для ложных значений.Если вы действительно хотите блок {| x |! x.nil?}]

...