Hashes

Hashes เป็นการเก็บข้อมูลคล้ายกับ Array ต่างกันที่ Hashes จะใช้ key word ในการอ้างอิงค่า แทนที่จะนับตามลำดับ

family = { :dad => "Sumon", :mom => "Viraporn", :sister => "Sasivimon"}

เราสามารถใช้ :dad หรือ “dad” ก็ได้ เพราะเป็น string เหมือนกัน แต่ที่เรานิยมใช้ :dad เพื่อแสดงความเป็น keyword ให้กับคนที่มาอ่าน code ของเรา (ดูความแตกต่างของ : และ “” ได้ในบท 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
 
# มี code กั้น 2000 บรรทัด หรืออยู่คนละไฟล์
 
love("Somsri","Somchai")

ปัญหาเกิดขึ้นตอนที่เรากลับมาอ่านโปรแกรมของเราแล้วไม่รู้ว่าจริงๆ ตัวแปลที่เราส่งไปอะไรมาก่อนมาหลัง ลองเทียบกับ

def love(option)
   puts "#option[:hunter] love #option[:victim]"
end
 
... 2000 line of code ...
 
love(:hunter =>"Somsri", :victim =>"Somchai")

แบบนี้เราจะอ่านรู้เรื่องว่าส่งตัวแปลอะไรไป

อย่างหนึ่งที่ควรรู้คือใน ruby ถ้าตัวแปลตัวสุดท้ายเป็น hashes เราไม่ต้องใส่ { } ดังนั้น การเรียนคำสั่ง love เราสามารถเรียกแบบนี้ได้

love :hunter => "Somsri", :victim => "Somchai"

หรือ

has_many :people, :class_name => "Person", :conditions => "deleted = 0", :order => "name"

เป็นต้น