Это плохо, чтобы проверить, если массив не пуст с помощью any?
метода?
a = [1,2,3]
a.any?
=> true
a.clear
a.any?
=> false
Или лучше использовать unless a.empty?
?
any?
не такой, как not empty?
в некоторых случаях.
>> [nil, 1].any?
=> true
>> [nil, nil].any?
=> false
Из документации:
Если блок не задан, Ruby добавляет неявный блок {| obj | obj} (то есть any? вернет true, если хотя бы один из членов коллекции не равен false или nil).
empty?
?present?
метод.#present?
только для Rails. В чистом рубине вы получитеNoMethodError: undefined method 'present?' for Array
.require 'activesupport'
.Разница между массивом, оценивающим его значения
true
или пустым.Метод
empty?
происходит из класса Arrayhttp://ruby-doc.org/core-2.0.0/Array.html#method-i-empty-3F
Он используется для проверки, содержит ли массив что-то или нет. Это включает в себя вещи, которые оценивают
false
, такие какnil
иfalse
.Метод
any?
происходит из модуля Enumerable.http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-any-3F
Он используется для оценки того, оценивается ли значение «any» в массиве
true
. Методы, аналогичные этомуnone?
,all?
иone?
где все они просто проверяют, сколько раз можно оценить истинность. который не имеет ничего общего с количеством значений, найденных в массиве.Случай 1
случай 2
случай 3
источник
Перед префиксом оператора восклицательным знаком вы узнаете, не является ли массив пустым. Так что в вашем случае -
источник
Избегайте
any?
больших массивов.any?
являетсяO(n)
empty?
являетсяO(1)
any?
не проверяет длину, но на самом деле сканирует весь массив на наличие истинных элементов.empty?
с другой стороны проверяет только длину массива.Разница актуальна, если у вас есть «разреженные» массивы, которые начинаются с большого количества
nil
значений, например, массив, который был только что создан.источник
nil
значений, с «нормальными» массивамиany?
без блочных возвратов в первом элементе, поэтому сложность по-прежнему равна O (1), какempty?
методЯ предлагаю использовать
unless
иblank
проверить пусто или нет.Пример :
Это будет знать «пусто» или нет. Если «а» пусто, приведенный ниже код не будет работать.
источник
#blank?
является частью Rails. Если они уже используют Rails,#present?
это отрицание в#blank?
любом случае.Я не думаю, что это плохо использовать
any?
вообще. Я использую это много. Это ясно и кратко.Однако, если вас беспокоят все
nil
значения, отбрасывающие его, тогда вы действительно спрашиваете, есть ли у массиваsize > 0
. В этом случае это очень простое расширение (НЕ оптимизированное, в стиле обезьяны) приблизит вас.Это довольно наглядно, логично спрашивать «имеет ли этот объект размер?». И это сжато, и это не требует ActiveSupport. И это легко построить.
Некоторые дополнения, чтобы думать о:
present?
из ActiveSupport.String
, которая игнорирует пробел (какpresent?
делает).length?
дляString
или других типов, где оно может быть более наглядным.Integer
другихNumeric
типов, чтобы возвращался логический нольfalse
.источник