วันนี้คุณจะเรียนรู้ 4 เมธอด Enumerable ที่จะช่วยให้คุณตรวจสอบเงื่อนไข conditional statement กับอาร์เรย์ของ elements, hash หรือออบเจกต์อื่นๆ ที่ include Enumerable module

เมธอด 4 ตัวนี้คืนค่า true หรือ false เท่านั้น
สารบัญ
- 1 Ruby All Method
- 2 All และ Empty Arrays
- 3 Ruby None Method
- 4 Ruby Any Method
- 5 Ruby One Method
- 6 ฟีเจอร์ใหม่ Ruby 2.5
- 7 สรุป
- 7.1 Related
มาเริ่มกัน!
Ruby All Method
หากต้องการตรวจสอบว่า strings ทั้งหมดในอาร์เรย์มีขนาดเฉพาะเจาะจง
คุณอาจทำแบบนี้:
def all_words_have_specific_size?(words)
return false if words.empty?
words.each do |str|
return false unless str.size == 5
end
true
end
words = ["bacon", "orange", "apple"]
all_words_have_specific_size?(words) # false
เราตรวจสอบทุก string หากขนาดไม่ใช่ที่ต้องการ คืน false มิฉะนั้นคืน true ท้ายสุด
โค้ดเยอะมากสำหรับอย่างนี้
จินตนาการว่าต้อง setup ทุกครั้ง ที่อยากทำ check แบบนี้
มันเป็นงานเยอะมาก!
สิ่งเดียวที่เราสนใจคือ:
str.size == 5
นั่นคือ เงื่อนไขที่เรากำลังตรวจสอบ
มีวิธีที่ดีกว่านี้ไหม?
มีครับ!
ใช้เมธอด all? ให้มันทำงานหนักแทนคุณ
วิธีใช้:
strings.all? { |str| str.size == 5 }
แค่นี้แหละ
All และ Empty Arrays
สิ่งหนึ่งที่ต้องรู้:
เมธอด all? นี้จะคืน true หากเรียกบน empty array
ตัวอย่าง:
[].all? { |s| s.size == 1 } # true
คำอธิบาย:
เพราะ ไม่มี element ใดเป็น false ดังนั้นทุก element ต้องเป็น true
นั่นคือตรรกะด้านหลังสิ่งนี้
Ruby None Method
หากต้องการตรงข้ามของ all? ใช้ none?
ตัวอย่าง:
strings.none? { |str| str.size == 5 }
คืน true หากไม่มี string ใด match เงื่อนไข หรือ false หากมีหนึ่งขึ้นไป match
มันเหมือน unless สำหรับ if statements
Ruby Any Method
อยากรู้ว่า element ใด element หนึ่ง match เงื่อนไขไหม?
ใช้เมธอด any?!
แบบนี้:
[1,2,3,4,5].any? # true
ในตัวอย่างเฉพาะนี้ any? ทำงานเหมือน inverse ของ empty? แต่นั้นไม่ได้ใช้ได้ทุกสถานการณ์
เพราะมันถามคำถาม:
"มี element TRUTHY ใดๆ ในอาร์เรย์นี้ไหม?"
หากอาร์เรย์มีแค่ค่า non-truthy (nil/false) จะได้ false แต่อาร์เรย์ไม่ได้ว่างจริงๆ
ตัวอย่าง:
[nil].any? # false
คุณยังส่ง block เข้าเมธอดนี้ได้:
[1,2,3].any? { |n| n > 0 } # true
จะตรวจสอบว่า n > 0 เป็น true สำหรับอย่างน้อยหนึ่ง element
Ruby One Method
คุณตรวจสอบได้ว่า มี element ที่คืน true เพียงตัวเดียว ด้วยเมธอด one?
ตัวอย่าง:
["a", 1, {}].one? { |obj| obj.kind_of?(Hash) } # true
คุณใช้ได้โดยไม่มี block เพื่อตรวจสอบว่าอาร์เรย์มี truthy value เพียงตัวเดียว (อะไรก็ตามที่ไม่ใช่ false / nil)
["a"].one? # true [].one? # false [nil].one? # false
ผมจะใช้ size == 1 เพราะ explicit กว่า ทุกคนจะเข้าใจได้แม้ไม่คุ้นเคย one? ซึ่งไม่ค่อย common
ฟีเจอร์ใหม่ Ruby 2.5
ตั้งแต่ Ruby 2.5 เมธอด 4 ตัวนี้ (any? / all? / none? / one?) รับอาร์กิวเมนต์เพิ่มได้ ซึ่งทำงานเหมือน argument ของ grep
นี่คือความหมาย:
[:orange, :apple, :coconut].any?(Symbol) # true [1,2,3].all?(1..10) # true
นี่คือ shortcut ดีๆ หากอยากตรวจสอบ class, regular expression หรือ range
สรุป
คุณเรียนรู้ 4 เมธอด Ruby ยอดเยี่ยมที่ช่วยประหยัดงานเยอะแล้ว! เมธอดเหล่านี้คืนค่าแค่ true หรือ false
หากยังไม่เคยใช้ เมธอดเหล่านี้… ทำไมไม่ลองตอนนี้?
กรุณาแชร์บทความนี้หากคุณพบว่ามีประโยชน์