Ebook Studio

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