คุณสามารถใช้เมธอด 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_all
method เป็นนามแฝงสำหรับ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 ในการทำงานกับคอลเลกชั่นของอ็อบเจ็กต์ เช่น อาร์เรย์ ช่วง และแฮช
ตอนนี้ถึงตาคุณแล้วที่จะเปิดตัวแก้ไขและใช้งาน
ขอบคุณสำหรับการอ่าน!