นับได้คืออะไร?
นับได้คือ การรวบรวมวิธีการวนซ้ำ , โมดูล Ruby และส่วนสำคัญที่ทำให้ Ruby เป็นภาษาการเขียนโปรแกรมที่ยอดเยี่ยม
นับรวมวิธีการที่เป็นประโยชน์เช่น :
mapselectinject
วิธีการนับได้ทำงานโดยให้บล็อก
ในบล็อกนั้น คุณบอกพวกเขาว่าคุณต้องการทำอะไรกับทุกองค์ประกอบ
ตัวอย่างเช่น :
[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 เป็นโมดูลที่ควรค่าแก่การเรียนรู้ ดังนั้นให้ข้ามไปที่เอกสารประกอบและดูว่าโมดูลนี้ทำอะไรให้คุณได้บ้าง!
อย่าลืมแชร์และสมัครรับจดหมายข่าวของฉันในแบบฟอร์มด้านล่างหากคุณชอบบทความนี้ มันจะช่วยฉันได้มาก! 🙂