นับได้คืออะไร?
นับได้คือ การรวบรวมวิธีการวนซ้ำ , โมดูล Ruby และส่วนสำคัญที่ทำให้ Ruby เป็นภาษาการเขียนโปรแกรมที่ยอดเยี่ยม
นับรวมวิธีการที่เป็นประโยชน์เช่น :
map
select
inject
วิธีการนับได้ทำงานโดยให้บล็อก
ในบล็อกนั้น คุณบอกพวกเขาว่าคุณต้องการทำอะไรกับทุกองค์ประกอบ
ตัวอย่างเช่น :
[1,2,3].map { |n| n * 2 }
ให้อาร์เรย์ใหม่แก่คุณโดยที่ทุกหมายเลขถูกเพิ่มเป็นสองเท่า
สิ่งที่เกิดขึ้นนั้นขึ้นอยู่กับวิธีที่คุณใช้ map
ช่วยให้คุณแปลงค่าทั้งหมด select
ให้คุณกรองรายการ &inject
สามารถใช้เพื่อเพิ่มค่าทั้งหมดภายในอาร์เรย์ได้
มีวิธีนับทับทิมมากกว่า 20 วิธี
มาศึกษาอย่างละเอียดกัน
วิธีการ Each_Cons
Enumerable
. ใหม่ที่ฉันโปรดปราน เมธอดคือ each_cons
!
นี่คือเหตุผล :
วิธีนี้มีประโยชน์มาก คุณสามารถใช้มันเพื่อค้นหา n-grams หรือตรวจสอบว่าลำดับของตัวเลขอยู่ติดกันหรือไม่เมื่อรวมกับ all?
อีก Enumerable
วิธีการ
each_cons
ให้อาร์เรย์ย่อยของขนาด n
ดังนั้นถ้าคุณมี [1,2,3]
แล้ว each_cons(2)
จะให้ [[1,2], [2,3]]
.
มาดูตัวอย่างกัน :
numbers = [3,5,4,2] numbers.sort.each_cons(2).all? { |x,y| x == y - 1 }
รหัสนี้เริ่มต้นด้วยการเรียงลำดับตัวเลขแล้วเรียก each_cons(2)
ซึ่งส่งคืน Enumerator
วัตถุแล้วเรียก all?
วิธีการตรวจสอบว่าองค์ประกอบทั้งหมดตรงกับเงื่อนไขหรือไม่
นี่เป็นอีกตัวอย่างหนึ่งที่ฉันใช้ each_cons
เพื่อตรวจสอบว่าอักขระถูกล้อมรอบด้วยอักขระตัวเดียวกันหรือไม่ ดังนี้:xyx
.
str = 'abcxyx' str.chars.each_cons(3).any? { |a,b,c| a == c }
ยังมีอีก!
หากคุณต้องการทราบว่ารูปแบบนี้เกิดขึ้นกี่ครั้ง แทนที่จะได้ true
/ false
ผลลัพธ์ คุณสามารถเปลี่ยน any?
เพื่อ count
.
สิ่งที่ฉันพบว่าน่าสนใจยิ่งกว่าคือการใช้งาน each_cons
วิธีการ
array = [] each do |element| array << element array.shift if array.size > n yield array.dup if array.size == n end
หมายเหตุ :สิ่งนี้มาจากการนำ Rubinius ไปใช้งาน
Enumerable
. คุณสามารถค้นหาซอร์สโค้ดต้นฉบับได้ที่นี่
การใช้งานเริ่มต้นด้วยอาร์เรย์ Ruby ที่ว่างเปล่า จากนั้นจะวนซ้ำผ่านองค์ประกอบต่างๆ โดยใช้ each
.
ทุกอย่างค่อนข้างมาตรฐานจนถึงที่นี่ แต่จากนั้นจะเพิ่มองค์ประกอบลงในอาร์เรย์และตัดแต่งอาร์เรย์ (โดยใช้ Array#shift) หากขนาดใหญ่กว่าที่เราต้องการ
ขนาดเป็นอาร์กิวเมนต์ของ each_cons
.
จากนั้นให้ผลเป็น dup
ของอาร์เรย์หากอาร์เรย์มีขนาดที่ร้องขอ
ฉันคิดว่านี่เป็นอัจฉริยะ เพราะมันเก็บเอฟเฟกต์ 'หน้าต่างบานเลื่อน' ไว้ในวัตถุที่นับได้ของเรา แทนที่จะต้องวุ่นวายกับดัชนีอาร์เรย์
วิธีการที่น่าสนใจยิ่งขึ้น
วิธีการ | คำอธิบาย |
---|---|
นับ | ตรงตามชื่อ นับสิ่งที่ประเมินว่าเป็นจริงภายในบล็อก |
group_by | จัดกลุ่มองค์ประกอบที่นับได้โดยใช้ค่าส่งคืนของบล็อก ส่งคืนแฮช |
พาร์ทิชัน | แบ่งเป็นสองกลุ่ม ส่งกลับอาร์เรย์สองมิติ |
มีไหม | คืนค่า true หากบล็อกส่งคืน true สำหรับองค์ประกอบใด ๆ ที่ให้ผล |
หมดไหม | คืนค่า true หากบล็อกส่งคืน true สำหรับองค์ประกอบทั้งหมดที่ได้รับ |
ไม่มี? | ตรงข้าม all? |
รอบ(n) | ทำซ้ำองค์ประกอบทั้งหมด n ครั้ง ดังนั้นหากคุณทำ [1,2].cycle(2) คุณจะมี [1,2,1,2] |
ค้นหา | ถูกใจ select แต่จะคืนค่าเป็นสิ่งแรกที่พบ |
ฉีด | รวบรวมผลลัพธ์ของค่าบล็อกก่อนหน้า &ส่งต่อไปยังค่าถัดไป มีประโยชน์ในการเพิ่มยอดรวม |
zip | ติดกาวสองอ็อบเจ็กต์ที่นับได้ ดังนั้นคุณจึงสามารถทำงานกับพวกมันแบบคู่ขนานกันได้ มีประโยชน์สำหรับการเปรียบเทียบองค์ประกอบ &สำหรับการสร้างแฮช |
แผนที่ | แปลงทุกองค์ประกอบของวัตถุที่นับได้ &ส่งคืนเวอร์ชันใหม่เป็นอาร์เรย์ |
บทสรุป
อย่างที่คุณเห็น Enumerable
เป็นโมดูลที่ควรค่าแก่การเรียนรู้ ดังนั้นให้ข้ามไปที่เอกสารประกอบและดูว่าโมดูลนี้ทำอะไรให้คุณได้บ้าง!
อย่าลืมแชร์และสมัครรับจดหมายข่าวของฉันในแบบฟอร์มด้านล่างหากคุณชอบบทความนี้ มันจะช่วยฉันได้มาก! 🙂