6 ответов:
any?- это неnot empty?в некоторых случаях.>> [nil, 1].any? => true >> [nil, nil].any? => falseиз документации:
Если блок не задан, Ruby добавляет неявный блок {/obj / obj} (что есть ли такие? вернет true, если хотя бы один из членов семейства не false или nil).
разница между массивом, оценивающим его значения в true или если он пуст.
метод
empty?происходит из класса массива
http://ruby-doc.org/core-2.0.0/Array.html#method-i-empty-3Fон используется для проверки, если массив содержит что-то или нет. Это включает в себя вещи, которые оцениваются как ложные, такие как nil и false.
>> a = [] => [] >> a.empty? => true >> a = [nil, false] => [nil, false] >> a.empty? => false >> a = [nil] => [nil] >> a.empty? => false
метод
any?происходит от перечисляемого module.
http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-any-3Fон используется для оценки, если" любые " значения в массиве оценивается в true. Подобных методов к этому нет? все? а один? где все они просто проверяют, сколько раз истина может быть оценена. которая не имеет ничего общего с подсчета значений в массиве.
корпус 1
>> a = [] => [] >> a.any? => false >> a.one? => false >> a.all? => true >> a.none? => trueкорпус 2
>> a = [nil, true] => [nil, true] >> a.any? => true >> a.one? => true >> a.all? => false >> a.none? => falseкорпус 3
>> a = [true, true] => [true, true] >> a.any? => true >> a.one? => false >> a.all? => true >> a.none? => false
префикс оператора с восклицательным знаком позволит вам узнать, не является ли массив пустым. Так что в вашем случае -
a = [1,2,3] !a.empty? => true
избежать
any?для больших массивов.
any?иO(n)empty?иO(1)
any?не проверяет длину, но на самом деле сканирует весь массив для истинных элементов.static VALUE rb_ary_any_p(VALUE ary) { long i, len = RARRAY_LEN(ary); const VALUE *ptr = RARRAY_CONST_PTR(ary); if (!len) return Qfalse; if (!rb_block_given_p()) { for (i = 0; i < len; ++i) if (RTEST(ptr[i])) return Qtrue; } else { for (i = 0; i < RARRAY_LEN(ary); ++i) { if (RTEST(rb_yield(RARRAY_AREF(ary, i)))) return Qtrue; } } return Qfalse; }
empty?С другой стороны проверяет только длину массива.static VALUE rb_ary_empty_p(VALUE ary) { if (RARRAY_LEN(ary) == 0) return Qtrue; return Qfalse; }разница актуальна, если у вас есть" разреженные " массивы, которые начинаются с большого количества
nilзначения, как, например, массив, который только что был создан.
Я предлагаю использовать
unlessиblankдля проверки пусто или нет.пример :
unless a.blank? a = "Is not empty" endЭто будет знать ' a ' пустой или нет. Если 'a' пустое, то ниже код не будет работать.
я не думаю, что это плохо, чтобы использовать
any?на всех. Я часто им пользуюсь. Это ясно и лаконично.однако если вы беспокоитесь о все
nilзначения выбрасывая его, то вы действительно спрашиваете, если массив имеетsize > 0. В этом случае это мертвое простое расширение (не оптимизированное, обезьянье) приблизит вас.Object.class_eval do def size? respond_to?(:size) && size > 0 end end > "foo".size? => true > "".size? => false > " ".size? => true > [].size? => false > [11,22].size? => true > [nil].size? => trueэто довольно описательно, логически спрашивая "имеет ли этот объект размер?". И это лаконично, и это не требует активной поддержки. И это легко построить на.
некоторые дополнения, чтобы думать о:
- это не то же самое как
present?из ActiveSupport.- вам может понадобиться пользовательская версия для
String, который игнорирует пробелы (напримерpresent?делает).- вам может понадобиться имя
length?наStringили другие типы, где это может быть более описательным.- вы можете захотеть его на заказ для
Integerи другиеNumericтипы, так что логический ноль возвращаетfalse.
Comments