วิธีเพิ่มแฮชที่มีอยู่ใน Ruby


102

เกี่ยวกับการเพิ่มkey => valueคู่ในแฮชที่มีอยู่ใน Ruby ฉันอยู่ในขั้นตอนการทำงานผ่าน Apress 'Beginning Ruby และเพิ่งจบบทแฮช

ฉันกำลังพยายามหาวิธีที่ง่ายที่สุดในการบรรลุผลลัพธ์เดียวกันด้วยแฮชเหมือนกับที่ทำกับอาร์เรย์:

x = [1, 2, 3, 4]
x << 5
p x

คำตอบ:


190

หากคุณมีแฮชคุณสามารถเพิ่มรายการได้โดยอ้างอิงตามคีย์:

hash = { }
hash[:a] = 'a'
hash[:a]
# => 'a'

ที่นี่เช่น[ ]สร้างอาร์เรย์ว่าง{ }จะสร้างแฮชที่ว่างเปล่า

อาร์เรย์มีองค์ประกอบเป็นศูนย์หรือมากกว่าในลำดับเฉพาะซึ่งองค์ประกอบอาจซ้ำกันได้ แฮชมีองค์ประกอบเป็นศูนย์หรือมากกว่าที่จัดเรียงตามคีย์โดยที่คีย์อาจไม่ซ้ำกัน แต่สามารถเก็บค่าในตำแหน่งเหล่านั้นได้

แฮชใน Ruby มีความยืดหยุ่นมากและสามารถมีกุญแจได้เกือบทุกประเภทที่คุณสามารถโยนทิ้งได้ สิ่งนี้ทำให้แตกต่างจากโครงสร้างพจนานุกรมที่คุณพบในภาษาอื่น ๆ

สิ่งสำคัญคือต้องจำไว้ว่าลักษณะเฉพาะของกุญแจแฮชมักมีความสำคัญ:

hash = { :a => 'a' }

# Fetch with Symbol :a finds the right value
hash[:a]
# => 'a'

# Fetch with the String 'a' finds nothing
hash['a']
# => nil

# Assignment with the key :b adds a new entry
hash[:b] = 'Bee'

# This is then available immediately
hash[:b]
# => "Bee"

# The hash now contains both keys
hash
# => { :a => 'a', :b => 'Bee' }

Ruby on Rails สร้างความสับสนให้กับสิ่งนี้ด้วยการให้ HashWithIndifferentAccess ซึ่งจะแปลงได้อย่างอิสระระหว่างวิธีการกำหนด Symbol และ String

คุณยังสามารถจัดทำดัชนีได้เกือบทุกอย่างรวมถึงชั้นเรียนตัวเลขหรือแฮชอื่น ๆ

hash = { Object => true, Hash => false }

hash[Object]
# => true

hash[Hash]
# => false

hash[Array]
# => nil

แฮชสามารถแปลงเป็นอาร์เรย์และในทางกลับกัน:

# Like many things, Hash supports .to_a
{ :a => 'a' }.to_a
# => [[:a, "a"]]

# Hash also has a handy Hash[] method to create new hashes from arrays
Hash[[[:a, "a"]]]
# => {:a=>"a"} 

เมื่อพูดถึงการ "แทรก" สิ่งต่างๆลงในแฮชคุณอาจทำทีละรายการหรือใช้mergeวิธีการรวมแฮช:

{ :a => 'a' }.merge(:b => 'b')
# {:a=>'a',:b=>'b'}

โปรดทราบว่าสิ่งนี้ไม่ได้เปลี่ยนแปลงแฮชดั้งเดิม แต่ส่งกลับแฮชใหม่แทน หากคุณต้องการรวมแฮชหนึ่งเข้าด้วยกันคุณสามารถใช้merge!วิธีการ:

hash = { :a => 'a' }

# Returns the result of hash combined with a new hash, but does not alter
# the original hash.
hash.merge(:b => 'b')
# => {:a=>'a',:b=>'b'}

# Nothing has been altered in the original
hash
# => {:a=>'a'}

# Combine the two hashes and store the result in the original
hash.merge!(:b => 'b')
# => {:a=>'a',:b=>'b'}

# Hash has now been altered
hash
# => {:a=>'a',:b=>'b'}

เช่นเดียวกับวิธีการมากมายในสตริงและอาร์เรย์ที่!แสดงให้เห็นว่ามันเป็นสถานที่ในการดำเนินงาน


12
ข้อมูลที่มีค่ามากมาย แต่ขาดสูตรพื้นฐานที่สุดตามที่ @robbrit ตอบไว้
danh

1
โปรดแก้ไขคำตอบของคุณเพื่อตอบคำถามที่ถูกถามโดยเฉพาะที่ที่อยู่ใกล้ด้านบนสุด ฉันจะทำเพื่อเธออย่างหยาบคาย
Stephan

@Stephan เพิ่มตัวอย่างที่กระชับมากขึ้นที่ด้านบน
tadman



8
x = {:ca => "Canada", :us => "United States"}
x[:de] = "Germany"
p x

ฉันได้พยายามใช้สิ่งนี้กับสิ่งต่อไปนี้x['key'] = "value"แต่ฉันได้รับข้อผิดพลาด ฉันควรพูดถึงฉันกำลังทำงานกับสตริง
ทอม

1
ข้อผิดพลาดคืออะไร? อาจเป็นอะไรก็ได้เว้นแต่คุณจะเจาะจงมากขึ้น
tadman

1
hash = { a: 'a', b: 'b' }
 => {:a=>"a", :b=>"b"}
hash.merge({ c: 'c', d: 'd' })
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 

ส่งคืนค่าที่ผสาน

hash
 => {:a=>"a", :b=>"b"} 

แต่ไม่แก้ไขวัตถุผู้โทร

hash = hash.merge({ c: 'c', d: 'd' })
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 
hash
 => {:a=>"a", :b=>"b", :c=>"c", :d=>"d"} 

การมอบหมายใหม่ทำเคล็ดลับ


0
hash {}
hash[:a] = 'a'
hash[:b] = 'b'
hash = {:a => 'a' , :b = > b}

คุณอาจได้รับคีย์และค่าจากการป้อนข้อมูลของผู้ใช้ดังนั้นคุณสามารถใช้ Ruby. to_sym สามารถแปลงสตริงเป็นสัญลักษณ์และ. to_iจะแปลงสตริงเป็นจำนวนเต็ม
ตัวอย่างเช่น:

movies ={}
movie = gets.chomp
rating = gets.chomp
movies[movie.to_sym] = rating.to_int
# movie will convert to a symbol as a key in our hash, and 
# rating will be an integer as a value.

0

คุณสามารถใช้ตัวดำเนินการ Splat คู่ซึ่งมีให้ตั้งแต่ Ruby 2.0:

h = { a: 1, b: 2 }
h = { **h, c: 3 }
p h
# => {:a=>1, :b=>2, :c=>3}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.