คุณสามารถใช้เมธอด select ใน Ruby เพื่อกรองอาร์เรย์ของอ็อบเจ็กต์ได้
ตัวอย่างเช่น คุณสามารถค้นหาทั้งหมด เลขคู่ในรายการ
ไม่มี select ที่มีลักษณะดังนี้:
even_numbers = []
[1,2,3,4,5,6].each do |n|
if n.even?
even_numbers << n
end
end
even_numbers
เป็นโค้ดที่ค่อนข้างง่ายสำหรับบางอย่าง!
มาเรียนรู้การใช้ select . กันเถอะ .
เลือกตัวอย่างวิธีการ
การใช้ select จำเป็นต้องมีการบล็อก
ภายในบล็อกคุณต้องส่งคืนสิ่งที่ประเมินเป็น true หรือ false และ select จะใช้สิ่งนั้นเพื่อกรองอาร์เรย์ของคุณ
คุณสามารถเรียนรู้เกี่ยวกับค่าบูลีนใน Ruby ได้โดยการอ่านบทความนี้
นี่คือตัวอย่าง :
[1,2,3,4,5,6].select { |n| n.even? }
สิ่งนี้จะทำในสิ่งเดียวกับตัวอย่างแรกในบทนำ แต่มีโค้ดน้อยกว่ามาก
อันที่จริง เราสามารถลดสิ่งนี้ได้มากกว่านี้อีก
ถูกใจสิ่งนี้ :
[1,2,3,4,5,6].select(&:even?)
ช็อตคัทประเภทนี้ใช้ได้เฉพาะเมื่อคุณต้องเรียกใช้เมธอดโดยตรงในทุกองค์ประกอบของอาร์เรย์
อีกอย่าง คุณยังสามารถใช้ select . ได้ ด้วยแฮช
ตัวอย่าง :
stock = {
apples: 10,
oranges: 5,
bananas: 1
}
stock.select { |k, v| v > 1 }
# {:apples=>10, :oranges=>5}
โดยที่ k แสดงถึงคีย์ &v แสดงถึงค่า
ฉันกำลังพูด :
"จงหาผลไม้ที่มีสต็อกมากกว่า 1 อันมาให้ข้า"
การรวม Select เข้ากับวิธีการอื่นๆ
คุณสามารถรวมเมธอด select กับเมธอด Enumerable อื่นได้
ที่โดดเด่นที่สุดคือ with_index .
ตัวอย่าง :
fruits = %w(apple orange banana)
fruits.select.with_index { |word, idx| idx.even? }
# ["apple", "banana"]
สิ่งนี้ทำให้คุณสามารถกรองโดยใช้ดัชนี แทนที่จะเป็นวัตถุ (ในกรณีนี้คือสตริง) เอง
การกรองอาร์เรย์ในตำแหน่ง
การใช้ select บนอาร์เรย์จะสร้างอาร์เรย์ใหม่เสมอ
หากคุณต้องการเปลี่ยนอาร์เรย์เดิม คุณสามารถใช้ select! วิธีการ
ตามนี้ :
fruits = %w(apple orange banana)
fruits.select! { |fruit| fruit.start_with? "a" }
# ["apple"]
วิธีการที่ลงท้ายด้วยเครื่องหมายอัศเจรีย์ (เช่น select! ) จะเปลี่ยนวัตถุแทนที่จะส่งคืนวัตถุใหม่ แต่กฎนี้ไม่ได้บังคับใช้โดยตัวภาษาเอง
มันเป็นแค่ข้อตกลงระหว่างเรา
ค้นหา vs เลือก
Select นั้นยอดเยี่ยมเมื่อคุณต้องการกรองรายการ &รับอาร์เรย์พร้อมผลลัพธ์
แต่ถ้าคุณต้องการหาวัตถุเพียงชิ้นเดียวล่ะ
คุณสามารถใช้ find วิธีการ
ถูกใจสิ่งนี้ :
letters = %w(a aa aaa aaaa)
letters.find { |l| l.size == 3 }
# "aaa"
letters.find { |l| l.size == 10 }
# nil
ค้นหาให้การจับคู่ครั้งแรกหรือ nil ถ้าหาไม่เจอ
ทำความเข้าใจวิธีค้นหาทั้งหมด
หากคุณสงสัยเกี่ยวกับ find_all และวิธีการที่เกี่ยวข้องกับ find &select ...
ง่ายมาก!
- The
find_allmethod เป็นนามแฝงสำหรับselect. - The
findวิธีช่วยให้คุณค้นหาวัตถุเฉพาะหนึ่งรายการ แทนที่จะค้นหาหลายวัตถุ
Ruby 2.6 เพิ่มนามแฝงอื่นสำหรับ select :
filter
สิ่งที่ตรงกันข้ามกับการเลือกคืออะไร
คุณสามารถลบองค์ประกอบที่คุณไม่ต้องการออกแทนที่จะเลือกองค์ประกอบที่คุณทำ
เลือกได้ง่าย :
[1,2,3,4,5,6].select { |n| n != 4 }
แต่มีวิธีการที่ทำให้สิ่งต่าง ๆ ชัดเจนขึ้น
วิธีนั้นคือ reject .
ตัวอย่าง :
[1,2,3,4,5,6].reject { |n| n == 4 }
คุณไม่ได้รับประโยชน์ทางเทคนิคใด ๆ ในแง่ของประสิทธิภาพหรืออย่างอื่น แต่จะทำให้โค้ดของคุณดีขึ้น
วิธีเลือกราง
ฉันไม่ต้องการให้คุณสับสนเมื่อคุณทำงานกับโมเดล Rails และเรียนรู้ว่าคุณสามารถใช้ select ได้ ที่นั่น
ควรรู้ไว้...
selectนี้ วิธีการก็ต่างกัน!
ตัวอย่าง :
Fruit.select(:id, :name, :color)
เมื่อคุณใช้ select ด้วย ActiveRecord โมเดลที่คุณขอเฉพาะคอลัมน์จากฐานข้อมูล
เท่าที่ฉันเข้าใจ ส่วนใหญ่จะทำเพื่อเหตุผลด้านประสิทธิภาพ
หมายเหตุสุดท้ายเกี่ยวกับเรื่องนี้ :
หากคุณกำลังทำงานกับอาร์เรย์ปกติภายในแอป Rails แสดงว่าคุณกำลังใช้ select วิธีที่เรากำลังพูดถึงตลอดบทความนี้
สรุป
คุณได้เรียนรู้เกี่ยวกับการเลือก ซึ่งเป็นวิธีการที่มีประโยชน์มากที่สุดวิธีหนึ่งของ Ruby ในการทำงานกับคอลเลกชั่นของอ็อบเจ็กต์ เช่น อาร์เรย์ ช่วง และแฮช

ตอนนี้ถึงตาคุณแล้วที่จะเปิดตัวแก้ไขและใช้งาน
ขอบคุณสำหรับการอ่าน!