วิธีหนึ่งในการเรียนรู้กลเม็ด รูปแบบ และวิธีใหม่ๆ ของ 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
สังเกตบางสิ่ง :
- เราใช้
cycle
เพื่อให้เราสามารถสลับไปมาระหว่าง VOWEL regex และ NON-VOWEL regex ได้ - เราแปลงสตริงเป็นอาร์เรย์ของอักขระด้วย
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) เกือบจะเหมือนกัน
- สแตกที่เราใช้อยู่เป็นเพียงอาร์เรย์เพราะไม่มี
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 ได้ดีขึ้น
อย่าลืมที่จะแบ่งปันบทความนี้เพื่อให้คนอื่น ๆ สามารถเพลิดเพลินกับมันได้
ขอบคุณสำหรับการอ่าน!