Ruby กับการเก็บข้อมูลแบบ Hash


โดย แสงเดือน จันทร์ใหม่ – 29 มิถุนายน 2558

Hash คืออะไร

Hash เป็นรูปแบบการเก็บข้อมูลชนิดหนึ่ง ซึ่งประกอบด้วยชุดของ Key และ Value โดย Key ของ Hash สามารถเป็นอะไรก็ได้ตามที่เรากำหนด และ Hash หนึ่งๆ สามารถมีชุด Key และ Value ได้กี่ชุดก็ได้ นอกจากนี้ค่า Value ของแต่ละ Key ใน Hash ก็สามารถเก็บเป็นข้อมูลชนิดใดก็ได้ ไม่จำเป็นว่าทุก Key จะต้องเก็บข้อมูล Value ที่เป็นชนิดเดียวกัน ซึ่งนั่นหมายรวมไปถึงเราสามารถเก็บ Value ที่เป็น Hash ได้ หรือ Hash ซ้อน Hash นั่นเอง

การใช้งาน Hash เบื้องต้น

  • การกำหนดค่าตัวแปร Hash

โครงสร้างของ Hash

[code language="ruby"]
name = {
    key_1: value_1,
    key_2: value_2,
    ...,
    key_n: value_n
}
[/code]

การประกาศค่าตัวแปร Hash ว่างๆ สามารถทำได้ ดังนี้

[code language="ruby"]
person = {}
[/code]

หรือ

[code language="ruby"]
person = Hash.new
[/code]

ตัวอย่างการสร้าง Hash

[code language="ruby"]
person = {
   name: 'Test Hash',
   age: 25,
   weight: 50.50,
   height: 160.00,
   pets: ['cat', 'dog', 'bird'],
   contacts: {
      phone: '090XXX4567',
      email: 'test.hash@mail.com'
   }
}
[/code]
  • การเข้าถึง Data ใน Hash

จากตัวอย่างข้อมูล person ด้านบน เราสามารถเข้าถึงข้อมูลที่เป็น Hash ได้ดังนี้

[code language="ruby"]
puts person['name']                             =>  Test Hash
puts person['age']                              =>  25
puts person.weight                              =>  50.50
puts person.height                              =>  160.00
puts person.pets.join(', ')                     =>  cat, dog, bird
person.contacts.each |key, value| do
  puts key                                      =>  phone และ email
  puts value                                    =>  090xxx4567 และ test.hash@mail.com
end
[/code]
  • Key

จากตัวอย่างเห็นได้ว่า ถ้าหากเราต้องการข้อมูลเฉพาะบาง Key แต่ถ้าเราไม่รู้ Key ก็จะไม่สามารถเข้าถึงข้อมูลนั้นได้ ทั้งนี้เราสามารถดู Key ทั้งหมดใน Hash ได้ ดังนี้

[code language="ruby"]
person.each_key { |key| puts key }              =>  name  age  weight  height  pets  contacts
person.keys                                     =>  ["name", "age", "weight", "height", "pets", "contacts"]
[/code]

นอกจากนี้เราสามารถตรวจสอบ Key ว่าเป็น Key ใน Hash หรือไม่ ได้ดังนี้

[code language="ruby"]
person.has_key?("name")                         =>  true
person.key?("position")                         =>  false
person.include?("pets")                         =>  true
person.member?("salary")                        =>  false
[/code]
  • Value

เราสามารถเข้าถึง Value ทั้งหมดของ Hash ได้เช่นเดียวกันกับ Key ดังนี้

[code language="ruby"]
person.each_value { |value| puts value }        =>  Test Hash  25  50.50  160.00  ['cat', 'dog', 'bird']  { phone: '090XXX4567', email: 'test.hash@mail.com' }
person.values                                   =>  ['Test Hash', 25, 50.50, 160.00, ['cat', 'dog', 'bird'], { phone: '090xxx4567', email: 'test'hash@mail.com'}]
[/code]

และเช่นเดียวกันเราสามารถตรวจสอบว่า Value อยู่ใน Hash หรือไม่ ได้ดังนี้

[code language="ruby"]
person.has_value?(25)                           =>  true
person.value?(['red', 'blue'])                  =>  false
[/code]
  • การเรียกดูคุณสมบัติเบื้องต้นของ Hash

การเรียกดูขนาดของ Hash

[code language="ruby"]
person.length                                   =>  6
person.size                                     =>  6
[/code]

ตรวจสอบ Hash ว่าง

[code language="ruby"]
person.empty?                                   =>  false
{}.empty?                                       =>  true
[/code]

ทำไมต้องใช้ Hash

เมื่อถามว่าทำไมต้องใช้ Hash ซึ่งเมื่อนำไปเทียบกับ Array แล้ว เราสามารถระบุข้อดีของ Hash ได้ดังนี้

  1. Hash เข้าถึงข้อมูลโดย Key แต่ Array เข้าถึงข้อมูลด้วย Index ซึ่ง Key สามารถสื่อความหมายได้ดีกว่า Array
  2. Hash สามารถชุด Key และ Value ได้กี่ชุดก็ได้ แต่ Array มีขนาดแน่ชัด หรือมีขนาดที่จำกัด
  3. Hash สามารถเก็บข้อมูลชนิดใดก็ได้ แต่ Array เก็บได้ชนิดเดียว ตามที่ประกาศไว้

ทั้งนี้ไม่ได้หมายความว่า Array ไม่ดี หรือไม่ควรใช้งาน แต่ควรเลือกประเภทการเก็บที่จะนำมาใช้ให้เหมาะสมตามข้อมูลที่จัดเก็บ และความสะดวกรวดเร็วในการเรียกใช้งานดีกว่า


สามารถศึกษาการใช้งาน Hash เพิ่มเติม ได้ที่นี่

http://ruby-doc.org/core-2.2.0/Hash.html#method-i-values