Ruby hash คืออะไร?
Hash เป็นโครงสร้างข้อมูลที่ใช้จัดเก็บข้อมูลในรูปแบบคู่คีย์-ค่า (key-value pairs) ที่ ไม่ซ้ำกัน (UNIQUE) ไม่เหมือนอาร์เรย์ ไม่มีดัชนีตัวเลข คุณเข้าถึงค่าแฮชด้วยคีย์
ตัวอย่างรวมถึง:
- รายการชื่อประเทศและรหัสประเทศที่สอดคล้องกัน (เช่น ES ⇾ Spain)
- พจนานุกรม ที่ทุกคำมีรายการคำจำกัดความที่เป็นไปได้
- โดเมนเนมและที่อยู่ IP ของมัน
การใช้แฮชในโปรแกรม Ruby ของคุณสามารถเร่งความเร็วโค้ดของคุณได้เมื่อใช้ในสถานการณ์ที่เหมาะสม
กล่าวอีกนัยหนึ่ง:
คุณมีข้อมูลที่เป็น (หรือสามารถแปลงเป็น) รูปแบบคล้ายพจนานุกรม ที่ข้อมูลสามารถจัดกลุ่มได้โดยคีย์และค่าที่เกี่ยวข้อง
วิธีสร้าง Hash
โอเค
เราเข้าใจแนวคิดทั่วไปของแฮشแล้ว แตจะสร้างยังไง?
แบบนี้:
{}
นั่นคือแฮชว่าง!
แฮชที่มีสามคู่คีย์/ค่า มีลักษณะแบบนี้:
{ a: 1, b: 2, c: 3 }
ที่ a เป็นคีย์ และ 1 เป็นค่าที่สอดคล้องสำหรับคีย์นั้น สังเกตว่าคู่คีย์-ค่าถูกแยกด้วยคอมมา
ตอนนี้:
มาดูวิธีใช้แฮชในโปรเจกต์ Ruby ของคุณกับเมธอดแฮชทั่วไป
การจัดเก็บค่าใน Ruby Hash
คุณสามารถสร้างแฮชพร้อมชุดค่าเริ่มต้นได้ ตามที่เราเห็นแล้ว
ตัวอย่างอีกอย่าง:
fruits = { coconut: 1, apple: 2, banana: 3 }
ทางเลือกอีกอย่างคือเพิ่มค่าใหม่เข้าไปในแฮชที่มีอยู่แล้ว
แบบนี้:
fruits[:orange] = 4
นี่คือ :orange เป็นคีย์แฮช และ 4 เป็นค่าที่สอดคล้อง
ทำไมเครื่องหมายทวิภาค (colon) จึงอยู่หน้า
:orangeเมื่อเข้าถึงค่า และอยู่หลังorange:เมื่อสร้างแฮช? มันเป็นไวยากรณ์ที่สวยงามกว่าที่ช่วยให้คุณสร้างแฮชโดยไม่ต้องใช้สัญลักษณ์แฮช-ร็อกเก็ต (=>) ซึ่งเป็นวิธีเก่าที่ถูกต้องแตเก่า
ค่าสามารถเป็นออบเจ็กต์ Ruby ใดๆ ได้
รวมถึง:
- สตริง (Strings)
- จำนวนเต็มและทศนิยม (Integers & Floats)
- อาร์เรย์ (Arrays)
คีย์ก็สามารถเป็นอะไรก็ได้ แตสัญลักษณ์ (symbols เช่น :banana) และสตริงเป็นประเภทคีย์ที่พบบ่อยที่สุด
จำไว้ว่า...
คีย์เป็นเอกลักษณ์ (unique) เราสามารถมีคีย์ :orange เพียงหนึ่งเดียว หรือคีย์ :apple เพียงหนึ่งเดียว
เมื่อคุณเพิ่มคีย์เดียวกันสองครั้ง คุณจะเปลี่ยนค่าของมัน
วิธีเข้าถึงค่าจาก Hash
คุณเข้าถึงแฮชด้วยคีย์
หากคุณต้องการเข้าถึงค่าโดยตรง แฮชอาจไม่ใช่โครงสร้างที่เหมาะสมสำหรับข้อมูลของคุณ
ตัวอย่าง:
fruits[:orange] # 4
นี่คือจุดสำคัญของแฮช คือ ค้นหารายการโดยคีย์อย่างรวดเร็ว
หากคีย์ไม่มีอยู่ คุณจะได้ nil
fruits[:peach] # nil
เป็นทางเลือก คุณสามารถใช้เมธอด fetch ซึ่งอนุญาตให้คุณระบุค่าเริ่มต้น (default value)
ตัวอย่าง:
fruits.fetch(:peach, 0)
หากคุณใช้ fetch โดยไม่มีค่าเริ่มต้น (อาร์กิวเมนต์ที่ 2) Ruby จะยกเว้นข้อยกเว้น KeyError
สิ่งนี้ช่วยได้เพราะคุณจะรู้ว่าคีย์ไหนหายไป
วิธีรวม (Merge) สอง Ruby Hash
คุณสามารถนำแฮชสองอันมารวมกันเป็นแฮชใหม่ได้
เมธอดไหนทำสิ่งนี้?
จริงๆ แล้วไมยากที่จะเดา เมธอดชื่อว่า merge
วิธีใช้:
defaults = { a: 1, b: 2, c: 3 }
preferences = { c: 4 }
defaults.merge!(preferences) # {:a=>1, :b=>2, :c=>4}
สังเกตว่าเนื่องจาก คีย์เป็นเอกลักษณ์ ค่าใหม่จะทับค่าเก่า
คุณสามารถใช้ข้อเท็จจริงนี้เพื่อโซลูชันที่น่าสนใจ เช่น สร้างแฮช "defaults" ที่ผู้ใช้สามารถทับทับได้โดยส่งแฮชของตัวเองมา
หากคุณต้องการควบคุมมากขึ้นเกี่ยวกับวิธีการรวมคีย์ คุณสามารถส่งบล็อก (block) เข้าไป
แบบนี้:
defaults.merge!(preferences) { |key, old, new| [old, new].max }
ที่ old คือค่าจาก defaults และ new คือค่าจาก preferences
หลายค่าสำหรับคีย์เดียว
ในพจนานุกรม...
คำเป็นเอกลักษณ์ แตอาจมีหลายค่า (คำจำกัดความ) ที่เกี่ยวข้อง
คุณสามารถทำได้ใน Ruby!
ตัวอย่าง:
dictionary = {
opportunity: [
"a set of circumstances that makes it possible to do something",
"a situation or condition favorable for attainment of a goal"
],
creativity: [
"the use of imagination or original ideas to create something new",
"the ability to create",
"the process where new ideas emerge from combining existing ideas in new ways"
]
}
dictionary[:creativity][1]
ที่ dictionary[:creativity] ให้คุณอาร์เรย์ และ [1] ให้คุณเอลีเมนต์ที่ 2 จากอาร์เร็ynั้น
กล่าวอีกนัยหนึ่ง:
คีย์คือสัญลักษณ์ และค่าคืออาร์เรย์ เมื่อคุณเข้าถึงแฮช คุณจะได้อาร์เรย์กลับมา ซึ่งคุณเข้าถึงได้ปกติ เหมือนอาร์เรย์อื่นๆ
วิธีเรียงลำดับ Hash
คุณสามารถเรียงลำดับอาร์เรย์ได้ แตคุณรู้ไหมว่าคุณสามารถเรียงลำดับแฮชได้ด้วย?
เมื่อคุณ sort แฮช มันจะถูกเรียงตามคีย์
ตัวอย่าง:
{ b: 1, a: 2 }.sort # [[:a, 2], [:b, 1]]
แตคุณยังสามารถเรียงตามค่าได้:
{ c: 3, b: 1, a: 2 }.sort_by(&:last)
คุณจะสังเกตว่าสิ่งที่คุณได้จากการเรียงแฮช ไม่ใช่แฮชอีกอัน...
มันคืออาร์เรย์!
แตคุณสามารถแปลงอาร์เรย์นี้กลับเป็นแฮชได้ โดยใช้เมธอด to_h
รับคีย์และค่าทั้งหมดจาก Hash
หากคุณต้องการรายการคีย์แฮชทั้งหมด ข่าวดี มีเมธอดสำหรับนั้น!
นี่คือมัน:
{ apple: 1, banana: 2 }.keys # [:apple, :banana]
ยังมีเมธอดที่ให้อาร์เรย์ที่ประกอบด้วยค่า:
{ apple: 1, banana: 2 }.values # [1, 2]
หากคุณต้องการรู้ว่าคีย์มีอยู่ในแฮชหรือไม่ แทนที่จะได้อาร์เรย์ของพวกมัน ให้ใช้เมธอด key?
เมธอดนี้ส่งคืนค่า true หรือ false
สรุป
คุณได้เรียนรู้เกี่ยวกับ Ruby hashes โครงสร้างข้อมูลที่ช่วยเหลือซึ่งประกอบด้วยคู่คีย์-ค่า คุณยังเรียนรู้วิธีเข้าถึงแฮชด้วยคีย์ และวิธีจัดเก็บข้อมูลใหม่ในแฮช
ตอนนี้เปิด irb (หรือ pry) ขึ้นมา และเริ่มเล่นกับแฮช!
ขอบคุณที่อ่าน 🙂