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

คู่มือพื้นฐานสำหรับโมดูล Ruby Enumerable (+ วิธีโปรดของฉัน)

นับได้คืออะไร?

นับได้คือ การรวบรวมวิธีการวนซ้ำ , โมดูล 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 วิธีการ

คู่มือพื้นฐานสำหรับโมดูล Ruby 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 เป็นโมดูลที่ควรค่าแก่การเรียนรู้ ดังนั้นให้ข้ามไปที่เอกสารประกอบและดูว่าโมดูลนี้ทำอะไรให้คุณได้บ้าง!

อย่าลืมแชร์และสมัครรับจดหมายข่าวของฉันในแบบฟอร์มด้านล่างหากคุณชอบบทความนี้ มันจะช่วยฉันได้มาก! 🙂