ตรวจสอบว่าอาร์เรย์ไม่ว่างเปล่าหรือไม่โดยใช้any?
วิธีการ?
a = [1,2,3]
a.any?
=> true
a.clear
a.any?
=> false
หรือมันจะดีกว่าที่จะใช้unless a.empty?
?
ตรวจสอบว่าอาร์เรย์ไม่ว่างเปล่าหรือไม่โดยใช้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} (นั่นคืออะไร? จะคืนค่าเป็นจริงถ้าอย่างน้อยหนึ่งในสมาชิกคอลเลกชันไม่ได้เป็นเท็จหรือไม่มี)
present?
วิธีการชำระเงิน
#present?
เป็น Rails-only NoMethodError: undefined method 'present?' for Array
ในทับทิมบริสุทธิ์คุณจะได้รับ
require 'activesupport'
สามารถใช้งานได้โดยไม่ต้องรางเพียงแค่ต้อง
true
หรือถ้ามันว่างเปล่าวิธีempty?
นี้มาจากคลาส Array
http://ruby-doc.org/core-2.0.0/Array.html#method-i-empty-3F
มันถูกใช้เพื่อตรวจสอบว่าอาร์เรย์มีบางสิ่งบางอย่างหรือไม่ ซึ่งรวมถึงสิ่งที่ประเมินfalse
เช่นและnil
false
>> a = []
=> []
>> a.empty?
=> true
>> a = [nil, false]
=> [nil, false]
>> a.empty?
=> false
>> a = [nil]
=> [nil]
>> a.empty?
=> false
วิธีany?
นี้มาจากโมดูล Enumerable
http://ruby-doc.org/core-2.0.0/Enumerable.html#method-i-any-3F
โดยจะใช้ในการประเมินว่า "ใด ๆ" true
ค่าในอาร์เรย์ประเมินเพื่อ วิธีการที่คล้ายกันนี้มีnone?
, all?
และone?
ที่พวกเขาทั้งหมดเป็นเพียงแค่ตรวจสอบเพื่อดูว่ากี่ครั้งที่ความจริงอาจจะได้รับการประเมิน ซึ่งไม่เกี่ยวข้องกับจำนวนของค่าที่พบในอาร์เรย์
กรณีที่ 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
ค่าจำนวนมากเช่นเช่นอาร์เรย์ที่เพิ่งสร้างขึ้น
nil
ค่าจำนวนมากโดยมีอาร์เรย์ "ปกติ" ที่any?
ไม่มีบล็อกส่งคืนที่องค์ประกอบแรกดังนั้นความซับซ้อนยังคงเป็น O (1) เช่นเดียวกับempty?
วิธีการ
ฉันจะแนะนำให้ใช้unless
และblank
ตรวจสอบว่าว่างเปล่าหรือไม่
ตัวอย่าง:
unless a.blank?
a = "Is not empty"
end
นี้จะรู้ว่า 'a' ว่างเปล่าหรือไม่ หาก 'a' ว่างเปล่ารหัสด้านล่างจะไม่ทำงาน
#blank?
เป็นส่วนหนึ่งของ Rails หากพวกเขากำลังอยู่แล้วโดยใช้ทางรถไฟ#present?
เป็นผลทางลบของการ#blank?
อยู่แล้ว
ฉันไม่คิดว่ามันจะไม่ดี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
นี่เป็นคำอธิบายที่สมเหตุสมผลและมีเหตุผลถามว่า "วัตถุนี้มีขนาดหรือไม่" และกระชับและไม่ต้องใช้ ActiveSupport และง่ายต่อการต่อเติม
ความพิเศษบางอย่างที่ควรคำนึงถึง:
present?
จาก ActiveSupportString
ซึ่งละเว้นช่องว่าง (เช่นpresent?
นั้น)length?
สำหรับString
หรือชนิดอื่น ๆ ที่มันอาจจะอธิบายเพิ่มเติมInteger
และNumeric
ประเภทอื่น ๆเพื่อให้ศูนย์ตรรกะกลับfalse
มา
empty?
อะไร?