Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

เชี่ยวชาญ Ruby Enumerable Methods: Any, All, None และ One

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

เชี่ยวชาญ Ruby Enumerable Methods: Any, All, None และ One

เมธอด 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

หากยังไม่เคยใช้ เมธอดเหล่านี้… ทำไมไม่ลองตอนนี้?

กรุณาแชร์บทความนี้หากคุณพบว่ามีประโยชน์