Ruby:Hashes
From Blognone
Hashes เป็นการเก็บข้อมูลคล้ายกับ Array ต่างกันที่ Hashes จะใช้ key word ในการอ้างอิงค่า แทนที่จะนับตามลำดับ
family = { :dad => "Sumon", :mom => "Viraporn", :sister => "Sasivimon"}
เราสามารถใช้ :dad หรือ "dad" ก็ได้ เพราะเป็น string เหมือนกัน แต่ที่เรานิยมใช้ :dad เพื่อแสดงความเป็น keyword ให้กับคนที่มาอ่าน source ของเรา (ดูความแตกต่างของ : และ "" ได้ในบท string)
วิธีการเรียกใช้ข้อมูลใน hashes
puts family[:dad] #=> "Sumon"
แสดงข้อมูลที่อยู่ใน hashes
family.keys #=> [:dad, :mom, :sister] family.value #=> ["Sumon", "Viraporn", "Sasivimon"]
เราสามารถเพิ่มข้อมูลลงใน hashes ได้เรื่อยๆ
family[:dog] = "Bobby" family.keys #=> [:dad, :mom, :sister, :dog]
ผมพบว่าการส่งค่าให้กับ function ด้วย hashes เป็นวิธีที่มีปรสิทธิภาพมาก ลองเทียบแบบนี้
แบบแรกไม่ใช้ hashes
def love(hunter , victim) puts "#{hunter} love #{victim}" end # มี source กั้น 2000 บรรทัด หรืออยู่คนละไฟล์ love("Somsri","Somchai")
ปัญหาเกิดขึ้นตอนที่เรากลับมาอ่านโปรแกรมของเราแล้วไม่รู้ว่าจริงๆ ตัวแปลที่เราส่งไปอะไรมาก่อนมาหลัง ลองเทียบกับ
def love(option) puts "#option[:hunter] love #option[:victim]" end ... 2000 line of source ... love(:hunter =>"Somsri", :victim =>"Somchai")
แบบนี้เราจะอ่านรู้เรื่องว่าส่งตัวแปลอะไรไป
อย่างหนึ่งที่ควรรู้คือใน Ruby ถ้าตัวแปลตัวสุดท้ายเป็น hashes เราไม่ต้องใส่ { } ดังนั้น การเรียนคำสั่ง love เราสามารถเรียกแบบนี้ได้
love :hunter => "Somsri", :victim => "Somchai"
หรือ
has_many :people, :class_name => "Person", :conditions => "deleted = 0", :order => "name"
เป็นต้น