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 เหตุผลที่เวอร์ชันที่สองดีกว่าในกรณีนี้: