เรื่อง partition array
ประโยคที่สับสนก็คือ
ary << [] if [*ary.last].nitems % len == 0
สับสนตรง ทำไมต้องใช้ prefix *
แล้ว prefix * คืออะไร
ทดลองดู
require 'pp'
pp [[1],[2],[3]][2]
=> [3]
pp *[[1],[2],[3]][2]
=> 3
Note: * มี priority ต่ำสุด
ประโยค
*[[1],[2],[3]][2]
การทำงานจริงจะเป็น
*([[1],[2],[3]][2])
นั่นคือ method [] จะถูกเรียกทำงานก่อน
ที่งงต่อก็คือ
[]
ที่ครอบ *ary.last
ทำไมต้องถอดออก(ด้วย *) แล้วก็ใส่เข้าไปใหม่ (ด้วย [])
สุดท้ายก็เดาว่า
ณ จุดเริ่มต้นการทำงาน ary.last มันจะเป็น null
ก็เลยใช้ short-cut แบบนี้เพื่อให้สามารถรองรับ case ary.last == nil ได้
ถ้าเป็นเราเขียน (แบบทื่อๆ) ก็คงเขียน
ary << [] if ary.last == nil or ary.last.nitems % len == 0