Topic 15
Topic 15
โค้ด Ruby ใช้ร่วมจากโฟลเดอร์ en/ ของต้นฉบับ เพื่อให้สองภาษาผูกกับชุดทดสอบเดียวกัน
ภาพรวม
ทำไมหัวข้อนี้จึงสำคัญ
หัวข้อ 14 สอนเรื่องการแปลงข้อมูลทีละขั้น ส่วนหัวข้อ 15 คือก้าวถัดไป: ปัญหาที่คุณ ต้องสร้างผลลัพธ์เพียงหนึ่งชิ้นจาก input หลายตัว ตรงนี้เองที่ reduce และ each_with_object กลายเป็นเครื่องมือใช้งานจริง ไม่ใช่ไอเดียเชิงนามธรรม
สิ่งที่ผมอยากให้คุณทำได้เมื่อจบหัวข้อนี้
เมื่อจบหัวข้อนี้ คุณควรจะ:
จุดที่ผมใช้ดูความเข้าใจ
ผมอยากให้คุณอธิบาย accumulator ที่เลือกได้ และบอกได้ว่าทำไมมันจึงชัดกว่าลูปแบบที่มี state ภายนอกคอยเปลี่ยนค่าไปมา
โน้ตสั้น
ไม่ใช่ทุกปัญหาที่เกี่ยวกับ collection จะเป็น map บางปัญหาต้องการ:
ตรงนี้เองที่การคิดแบบ accumulator สำคัญขึ้นมา
แบบ imperative มักหน้าตาอย่างนี้:
total = 0 rows . each do |row| total += row [: amount ] end shortnote.md ruby ส่วน Ruby แบบ accumulator อาจหน้าตาอย่างนี้:
rows . reduce ( 0 ) { |sum , row| sum + row [: amount ] } shortnote.md ruby ถ้าเป็น hashes หรือโครงสร้างที่จัดกลุ่ม each_with_object มักอ่านดีกว่าอีก:
rows . each_with_object ({}) do |row , grouped| grouped [ row [: currency ]] || = 0 grouped [ row [: currency ]] += row [: amount ] end shortnote.md ruby จุดที่ Ruby ทำได้ดีในหัวข้อนี้:
จุดที่ต้องระวังในหัวข้อนี้:
คำถามชวนคิด:
ตัวอย่างแบบลงมือดู
Example 1: ยอดรวมของ invoices
แบบเก่า:
total = 0 invoices . each do |invoice| total += invoice [: amount ] end worked_examples.md ruby แบบ accumulator:
invoices . reduce ( 0 ) { |sum , invoice| sum + invoice [: amount ] } worked_examples.md ruby เหตุผลที่เวอร์ชันที่สองช่วยได้: