Yanıtlar:
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).
present?yöntemini kullanmak isteyebilirsiniz .
#present?sadece Raylar içindir. Saf Ruby'de elde edersiniz NoMethodError: undefined method 'present?' for Array.
require 'activesupport'.
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
İ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
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 .
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
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.
#blank?Rails'ın bir parçasıdır. Zaten Rails kullanıyorlarsa, zaten #present?olumsuzlama #blank?.
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:
present?ActiveSupport ile aynı değildir .StringBeyaz alanı yok sayan (olduğu gibi present?) için özel bir sürüm isteyebilirsiniz .length?için Stringdaha açıklayıcı olabilir veya başka tür.Integerve diğer Numerictürler için özel isteyebilirsiniz false.
empty??