Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

เชี่ยวชาญ Ruby Hashes: นิยาม ตัวอย่าง และเมธอดสำคัญ

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) ขึ้นมา และเริ่มเล่นกับแฮช!

ขอบคุณที่อ่าน 🙂