Dizinin boş olmadığını kontrol edin: herhangi biri?


191

Yöntem kullanarak bir dizinin boş olup olmadığını kontrol etmek kötü mü any??

a = [1,2,3]

a.any?
=> true

a.clear

a.any?
=> false

Yoksa kullanmak daha unless a.empty?mı iyi ?

Yanıtlar:


248

any?not empty?bazı durumlarda olduğu gibi değildir .

>> [nil, 1].any?
=> true
>> [nil, nil].any?
=> false

Belgelerden:

Blok verilmezse, Ruby {| obj | obj} (toplama üyelerinden en az biri yanlış veya sıfır değilse, herhangi bir? doğru değerini döndürür).


8
Karşısında herhangi bir işlev var mı empty??
RocketR

12
@RocketR ödeme present?yöntemini kullanmak isteyebilirsiniz .
dantheta

15
@dantastic #present?sadece Raylar içindir. Saf Ruby'de elde edersiniz NoMethodError: undefined method 'present?' for Array.
RocketR

6
Tam olarak Raylar değil, Aktif Destek raylar olmadan kullanılabilir, sadece gerekir require 'activesupport'.
Sergio

83

Değerlerini değerlendiren trueveya boş olup olmadığını değerlendiren bir dizi arasındaki fark .

Yöntem empty?, Array sınıfından gelir
http://ruby-doc.org/core-2.0.0/Array.html#method-i-empty-3F

Dizinin bir şey içerip içermediğini kontrol etmek için kullanılır. Bu, ve falsegibi değerlendirilen şeyleri içerir .nilfalse

>> a = []
=> []
>> a.empty?
=> true
>> a = [nil, false]
=> [nil, false]
>> a.empty?
=> false
>> a = [nil]
=> [nil]
>> a.empty?
=> false

Yöntem any?, Numaralandırılabilir modülünden gelir.
http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-any-3F

Dizideki "herhangi bir" değerin değerlendirip değerlendirmediğini değerlendirmek için kullanılır true. Buna benzer yöntemler none?, all?ve one?hepsinin kaç kez doğru olduğunu değerlendirebildiğini kontrol ediyor. bir dizide bulunan değerlerin sayısı ile ilgisi yoktur.

dava 1

>> a = []
=> []
>> a.any?
=> false
>> a.one?
=> false
>> a.all?
=> true
>> a.none?
=> true

vaka 2

>> a = [nil, true]
=> [nil, true]
>> a.any?
=> true
>> a.one?
=> true
>> a.all?
=> false
>> a.none?
=> false

vaka 3

>> a = [true, true]
=> [true, true]
>> a.any?
=> true
>> a.one?
=> false
>> a.all?
=> true
>> a.none?
=> false

31

İfadenin başına bir ünlem işareti konulması, dizinin boş olup olmadığını size bildirir. Yani sizin durumunuzda -

a = [1,2,3]
!a.empty?
=> true

27
Çifte olumsuzluk mu? Ciddi misin?
3lvis

29
O kadar da ciddi değil!
Alexander Bird

5
Hehe. Çift olumsuzlama ideal değildir, sadece bu özel durumda daha okunabilir görünüyor.
Denny Abraham Cheriyan

12
Çift negatif, "Dizinin boş olmadığını kontrol et" orijinal sorusunun bir parçasıydı. Bu soruya cevap verir.
mattfitzgerald

30

any?Büyük dizilerden kaçının .

  • any? dır-dir O(n)
  • empty? dır-dir O(1)

any? uzunluğu kontrol etmez, ancak tüm diziyi gerçek öğeler için tarar.

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? diğer yandan sadece dizinin uzunluğunu kontrol eder.

static VALUE
rb_ary_empty_p(VALUE ary)
{
  if (RARRAY_LEN(ary) == 0)
    return Qtrue;
  return Qfalse;
}

Fark, nilyeni oluşturulmuş bir dizi gibi çok sayıda değerle başlayan "seyrek" dizileriniz varsa önemlidir .


Bu kullanım durumunda, fark yalnızca ilk öğede blok dönüşü olmayan nil"normal" dizilerle çok sayıda değerle başlayan "seyrek" dizileriniz varsa önemlidir any?, bu nedenle karmaşıklık hala empty?yöntem gibi O (1) olur
David Costa

4

Kontrol etmek için unlessve blankişaretinin boş olup olmadığını öneririm .

Misal :

unless a.blank?
  a = "Is not empty"
end

Bu 'boş' bilip bilmeyecektir. 'A' boşsa, aşağıdaki kod çalışmaz.


4
#blank?Rails'ın bir parçasıdır. Zaten Rails kullanıyorlarsa, zaten #present?olumsuzlama #blank?.
Eva

0

Hiç kullanmanın kötü olduğunu düşünmüyorum any?. Onu çok kullanırım. Açık ve özlü.

Ancak, tüm nildeğerleri atmaktan endişe ediyorsanız, dizinin gerçekten olup olmadığını soruyorsunuz size > 0. Bu durumda, bu ölü basit uzantı (optimize edilmemiş, maymun tarzı) sizi yakınlaştıracaktır.

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

Bu oldukça açıklayıcıdır ve mantıksal olarak "bu nesnenin bir boyutu var mı?" Ve kısa ve ActiveSupport gerektirmiyor. Ve üzerine inşa etmek kolaydır.

Düşünülmesi gereken bazı ekstralar:

  1. Bu present?ActiveSupport ile aynı değildir .
  2. StringBeyaz alanı yok sayan (olduğu gibi present?) için özel bir sürüm isteyebilirsiniz .
  3. Adını isteyebilirsiniz length?için Stringdaha açıklayıcı olabilir veya başka tür.
  4. Mantıksal sıfırın geri dönmesi için özel Integerve diğer Numerictürler için özel isteyebilirsiniz false.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.