Ebook Studio

Topic 14

Topic 14

โค้ด Ruby ใช้ร่วมจากโฟลเดอร์ en/ ของต้นฉบับ เพื่อให้สองภาษาผูกกับชุดทดสอบเดียวกัน

ภาพรวม

ทำไมหัวข้อนี้จึงสำคัญ

ผู้เรียนมักมอง map , zip และ lambdas เป็นไวยากรณ์ที่ดูฉลาดเกินจำเป็น แต่นั่นเป็นมุม มองที่ทำให้พลาดของจริง เครื่องมือเหล่านี้มีประโยชน์มากในงานเขียนโค้ดที่แปลงข้อมูลอย่าง ชัดเจน ส่งพฤติกรรมในรูปค่าได้ และไม่ต้องตั้งตัวแปรที่คอยเปลี่ยนค่าไปมามากเกินไป

หัวข้อนี้จึงอยากให้เห็นคุณค่าจริงของ functional style ใน Ruby:

สิ่งที่ผมอยากให้คุณทำได้เมื่อจบหัวข้อนี้

เมื่อจบหัวข้อนี้ คุณควรจะ:

จุดที่ผมใช้ดูความเข้าใจ

ผมอยากให้คุณอธิบายได้ว่าอะไรดีขึ้นเมื่อโค้ดย้ายจากลูปที่เขียนเอง ไปสู่การแปลงข้อมูลบน collection และเมื่อไรไม่ควรฝืนทำให้ทุกอย่างกลายเป็นลำดับขั้น

โน้ตสั้น

Ruby ไม่ได้กำลังบอกให้ผู้เรียนกลายเป็น pure functional programmer แต่มันชวนให้เห็น ว่าปัญหาธรรมดาหลายอย่างอ่านง่ายขึ้น เมื่อเขียนเป็นชุดของการแปลงข้อมูลทีละขั้น แทนที่จะ เป็นชุดของการเปลี่ยนค่าไปเรื่อย ๆ

แบบ imperative มักหน้าตาอย่างนี้:

rows = [] names . each_with_index do |name , index| score = scores [ index ] next if score < 60 rows << "#{name}: #{score}" end shortnote.md ruby ส่วน Ruby แบบ functional มักหน้าตาอย่างนี้:

names . zip ( scores ) . select { |_name , score| score > = 60 } . map { |name , score| "#{name}: #{score}" } shortnote.md ruby เวอร์ชันที่สองไม่ได้ดีกว่าเพราะมันสั้นกว่า แต่มันดีกว่าเพราะแต่ละขั้นตอบคำถามคนละข้อ:

จุดที่ Ruby ทำได้ดีในหัวข้อนี้:

จุดที่ต้องระวังในหัวข้อนี้:

คำถามชวนคิด:

ตัวอย่างแบบลงมือดู

Example 1: ลูปที่เขียนเอง เทียบกับการแปลงข้อมูลทีละขั้น

แบบเก่า:

rows = [] quantities . each_with_index do |qty , index| price = prices [ index ] rows << qty * price end worked_examples.md ruby Ruby แบบ functional:

quantities . zip ( prices ). map { |qty , price| qty * price } worked_examples.md ruby เหตุผลที่เวอร์ชันที่สองดีกว่าในกรณีนี้: