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

7 ตัวอย่างรหัสทับทิมที่น่าสนใจ

วิธีหนึ่งในการเรียนรู้กลเม็ด รูปแบบ และวิธีใหม่ๆ ของ Ruby คือการอ่านโค้ดที่คนอื่นเขียน

แต่คุณจะพบโค้ดที่น่าสนใจที่ควรค่าแก่การอ่าน ?

เรามีโครงการโอเพ่นซอร์สมากมายและไซต์ท้าทายการเข้ารหัสที่ช่วยให้คุณเห็นโซลูชันจากนักพัฒนารายอื่นเมื่อคุณส่งของคุณเอง

ในบทความนี้ :

ฉันได้รวบรวม 7 ตัวอย่างที่ฉันคิดว่าคุณจะชอบ

ฉันจะให้ความเห็นเกี่ยวกับตัวอย่างแต่ละตัวอย่างเพื่อช่วยให้คุณได้รับประโยชน์สูงสุดจากสิ่งนี้

ผลรวมของสองจำนวน

ในตัวอย่างนี้ เราต้องการค้นหาว่าให้อาร์เรย์ของตัวเลขที่ไม่ซ้ำ มีการรวมกันของตัวเลขสองตัวที่รวมกันเป็นตัวเลขเป้าหมายหรือไม่

รหัส :

def sum_eq_n?(arr, n) คืนค่า true ถ้า arr.empty? &&n ==0 arr.product(arr).reject { |a,b| a ==b }.มีไหม { |a,b| a + b ==n }จบ

สิ่งนี้น่าสนใจเพราะฉันใช้ product วิธีการที่นี่

เมื่อคุณใช้วิธีนี้จะเหมือนกับการวนซ้ำภายในลูปที่รวมค่าทั้งหมดในอาร์เรย์ A เข้ากับค่าทั้งหมดในอาร์เรย์ B

การนับ การทำแผนที่ และการค้นหา

สมมติว่าคุณต้องการหาจำนวนที่หายไปในลำดับเลขคณิต เช่น (2,4,6,10) .

เราสามารถใช้กลยุทธ์ในการคำนวณความแตกต่างระหว่างตัวเลขได้

[2, 2, 4]

เป้าหมายของเราที่นี่คือการค้นหาว่าลำดับคืออะไร

เพิ่มขึ้นหรือลดลงหรือไม่

เท่าไหร่คะ

รหัสนี้แสดงลำดับ:

ความแตกต่าง =[2, 2, 4]differences.max_by { |n| Difference.count(n) }# 2# นี่คือการเพิ่มขึ้นระหว่างตัวเลขในลำดับ

เมื่อเราทราบลำดับแล้ว เราก็สามารถเปรียบเทียบตัวเลขทั้งหมดเพื่อหาตัวเลขที่หายไปได้

นี่คือรหัส :

def find_missing(sequence) ต่อเนื่อง =sequence.each_cons(2) ความแตกต่าง =continuous.map { |a,b| b - a } ลำดับ =Difference.max_by { |n| Difference.count(n) } Missing_between =ต่อเนื่องกัน.find { |a,b| (b - a) !=ลำดับ } missing_between.first + sequenceendfind_missing([2,4,6,10])# 8

นับจำนวนวิธีที่เราใช้ Ruby เพื่อทำงานหนักเพื่อเรา 🙂

ตัวอย่างนิพจน์ทั่วไป

หากคุณกำลังทำงานกับสตริงและต้องการค้นหารูปแบบ นิพจน์ทั่วไปคือเพื่อนของคุณ

การทำอย่างถูกต้องอาจเป็นเรื่องยากเล็กน้อย แต่การฝึกฝนทำให้เชี่ยวชาญ!

ตอนนี้ :

สมมติว่าเราต้องการทราบว่าสตริงที่กำหนดเป็นไปตามรูปแบบของอักขระ VOWEL ถึง NON-VOWEL หรือไม่

ถูกใจสิ่งนี้ :

"ateciyu"

จากนั้นเราก็สามารถใช้นิพจน์ทั่วไปร่วมกับ match? วิธีการคิดออก

นี่คือตัวอย่างโค้ด :

def alternating_characters?(s) type =[/[aeiou]/, /[^aeiou]/].cycle if s.start_with?(/[^aeiou]/) type.next end s.chars.all? { |ch| ch.match?(type.next) }endalternating_characters?("ateciyu")# true

สังเกตบางสิ่ง :

  1. เราใช้ cycle เพื่อให้เราสามารถสลับไปมาระหว่าง VOWEL regex และ NON-VOWEL regex ได้
  2. เราแปลงสตริงเป็นอาร์เรย์ของอักขระด้วย chars เพื่อให้เราใช้ all? วิธีการ

ตัวอย่างการเรียกซ้ำและสแต็ค

การเรียกซ้ำคือการที่เมธอดเรียกตัวเองหลายครั้งเพื่อเป็นแนวทางในการแก้ปัญหา

ปัญหาที่น่าสนใจมากมายสามารถแก้ไขด้วยการเรียกซ้ำ .

แต่เนื่องจากการเรียกซ้ำมีขีดจำกัด คุณจึงใช้โครงสร้างข้อมูลสแต็กแทนได้

ตอนนี้ :

ลองดูตัวอย่างที่เราต้องการหา "ชุดพลังงาน" ของอาร์เรย์ที่กำหนด ชุดพลังงานคือชุดของชุดย่อยทั้งหมดที่สามารถสร้างได้จากอาร์เรย์

นี่คือตัวอย่างที่มีการเรียกซ้ำ :

def get_numbers(list, index =0, taken =[]) return [taken] if index ==list.size get_numbers(list, index+1, taken) + get_numbers(list, index+1, taken + [ list[index]])endget_numbers([1,2,3])

นี่คือปัญหาเดียวกันที่แก้ไขได้โดยใช้สแต็ก :

def get_numbers_stack(list) stack =[[0, []]] output =[] จนกว่า stack.empty? ดัชนี, ถ่าย =stack.pop เอาต์พุตถัดไป <<ถ่ายแล้วถ้าดัชนี ==list.size stack.unshift [ดัชนี + 1, ถ่ายแล้ว] stack.unshift [ดัชนี + 1, ถ่ายแล้ว + [รายการ[ดัชนี]]] สิ้นสุดเอาต์พุต 

แนวคิดคือในแต่ละรอบของอัลกอริทึม เราใช้ตัวเลขหรือไม่ใช้ตัวเลข

เราแยกสาขาออกและลองใช้ผลลัพธ์ทั้งสองเพื่อสร้างชุดค่าผสมที่เป็นไปได้ทั้งหมด .

ลองนึกภาพต้นไม้ที่แต่ละใบเป็นคำตอบ

บางสิ่งที่ควรสังเกต :

  1. วิธีการเรียกซ้ำสั้นกว่า
  2. ส่วน "กำลังดำเนินการ" ที่แท้จริงของอัลกอริทึม (ดัชนี + 1) เกือบจะเหมือนกัน
  3. สแตกที่เราใช้อยู่เป็นเพียงอาร์เรย์เพราะไม่มี Stack คลาสใน Ruby

ตัวอย่างการโยงวิธีการ

นี่เป็นตัวอย่างที่ฉันชอบเพราะมันแสดงให้เห็นว่า Ruby ทรงพลังเพียงใด

การรวมวิธีการทำให้คุณสามารถ นำผลลัพธ์ที่ได้จากวิธีหนึ่งและส่งผ่านไปยังอีกวิธีหนึ่ง .

เหมือนกับสายการผลิตของโรงงาน!

คุณเริ่มต้นด้วยวัตถุดิบ (อินพุต) จากนั้นผ่านกระบวนการเรียกวิธีการเหล่านี้ คุณจะค่อยๆ เปลี่ยนวัตถุดิบให้เป็นผลลัพธ์ที่ต้องการ

นี่คือตัวอย่าง :

def longest_repetition(string) max =string .chars .chunk(&:itself) .map(&:last) .max_by(&:size) max ? [max[0], max.size] :["", 0]endlongest_repetition("aaabb")# ["a", 3]

จากสตริง รหัสนี้จะค้นหา อักขระที่ซ้ำกันที่ยาวที่สุด .

หมายเหตุ :

  • จัดรูปแบบโค้ดนี้อย่างไรเพื่อให้อ่านง่ายที่สุด
  • การใช้ Symbol#to_proc รูปแบบ (&:size )

แต่อย่าสับสนกับ "Law of Demeter"

"กฎหมาย" นั้นเกี่ยวกับการเอื้อมมือเข้าไปในอวัยวะภายในของวัตถุอื่น

ที่นี่เราแค่เปลี่ยนวัตถุเท่านั้น

พร้อมตัวอย่างดัชนี

คุณต้องการให้มีดัชนีปัจจุบันในขณะที่วนซ้ำคอลเลกชันของรายการหรือไม่

คุณสามารถใช้ with_index วิธีการ

นี่คือตัวอย่าง :

def reverse_alternate(สตริง) string.gsub(/[^\s]+/).with_index { |w, idx| idx.even? ? w :w.reverse }endreverse_alternate("Apples Are Good")# "Apples erA Good"

ประกาศ :

  • เรารวม with_index &even? เพื่อดูว่าเราต้องกลับคำปัจจุบันหรือไม่
  • Gsub ที่ไม่มีบล็อกจะส่งคืน Enumerator วัตถุ ซึ่งให้คุณโยงมันด้วยวิธีอื่นได้

แต่ละรายการมีตัวอย่างวัตถุ

อีกวิธีที่น่าสนใจคือ each_with_object และเพื่อน with_object .

คุณสามารถใช้สองวิธีนี้เมื่อคุณต้องการวัตถุเพื่อเก็บผลลัพธ์

นี่คือตัวอย่าง :

def clean_string(str) str .chars .each_with_object([]) { |ch, obj| ช =="#" ? obj.pop :obj < 

ในตัวอย่างนี้ เราต้องการลบอักขระตัวสุดท้ายเมื่อเราพบ # สัญลักษณ์

ประกาศ :

  • each_with_object รับอาร์กิวเมนต์ซึ่งเป็นวัตถุที่เราต้องการเริ่มต้นด้วย อาร์กิวเมนต์นี้จะกลายเป็นพารามิเตอร์บล็อกที่ 2
  • เรากำลังแปลงสตริงเป็นอาร์เรย์ของอักขระ (char ) &จากนั้นกลับไปที่สตริงเมื่อเราทำเสร็จแล้ว (join )
  • เรากำลังใช้ตัวดำเนินการ ternary เพื่อตัดสินใจว่าจะทำอย่างไร ซึ่งจะทำให้โค้ดสั้นลง

สรุป

ในบทความนี้ คุณได้เห็นตัวอย่างโค้ดที่น่าสนใจพร้อมคำอธิบายและคำอธิบายของฉันแล้ว เพื่อช่วยให้คุณเขียนโค้ด Ruby ได้ดีขึ้น

อย่าลืมที่จะแบ่งปันบทความนี้เพื่อให้คนอื่น ๆ สามารถเพลิดเพลินกับมันได้

ขอบคุณสำหรับการอ่าน!