Проверьте массив не пустой: любой?



это плохо, чтобы проверить, если массив не очистить с помощью any? способ?



a = [1,2,3]

a.any?
=> true

a.clear

a.any?
=> false


или лучше использовать unless a.empty? ?

436   6  

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

это довольно описательно, логически спрашивая "имеет ли этот объект размер?". И это лаконично, и это не требует активной поддержки. И это легко построить на.

некоторые дополнения, чтобы думать о:

  1. это не то же самое как present? из ActiveSupport.
  2. вам может понадобиться пользовательская версия для String, который игнорирует пробелы (например present? делает).
  3. вам может понадобиться имя length? на String или другие типы, где это может быть более описательным.
  4. вы можете захотеть его на заказ для Integer и другие Numeric типы, так что логический ноль возвращает false.

Comments

    Ничего не найдено.