Saturday, January 28, 2006

วันนี้เห็น ruby code ใน redhanded
เรื่อง 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

Related link from Roti

No comments: