เกี่ยวกับการเพิ่มkey => value
คู่ในแฮชที่มีอยู่ใน Ruby ฉันอยู่ในขั้นตอนการทำงานผ่าน Apress 'Beginning Ruby และเพิ่งจบบทแฮช
ฉันกำลังพยายามหาวิธีที่ง่ายที่สุดในการบรรลุผลลัพธ์เดียวกันด้วยแฮชเหมือนกับที่ทำกับอาร์เรย์:
x = [1, 2, 3, 4]
x << 5
p x
เกี่ยวกับการเพิ่มkey => value
คู่ในแฮชที่มีอยู่ใน Ruby ฉันอยู่ในขั้นตอนการทำงานผ่าน Apress 'Beginning Ruby และเพิ่งจบบทแฮช
ฉันกำลังพยายามหาวิธีที่ง่ายที่สุดในการบรรลุผลลัพธ์เดียวกันด้วยแฮชเหมือนกับที่ทำกับอาร์เรย์:
x = [1, 2, 3, 4]
x << 5
p x
คำตอบ:
หากคุณมีแฮชคุณสามารถเพิ่มรายการได้โดยอ้างอิงตามคีย์:
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'}
เช่นเดียวกับวิธีการมากมายในสตริงและอาร์เรย์ที่!
แสดงให้เห็นว่ามันเป็นสถานที่ในการดำเนินงาน
my_hash = {:a => 5}
my_hash[:key] = "value"
หากคุณต้องการเพิ่มมากกว่าหนึ่ง:
hash = {:a => 1, :b => 2}
hash.merge! :c => 3, :d => 4
p hash
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"}
การมอบหมายใหม่ทำเคล็ดลับ
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.
คุณสามารถใช้ตัวดำเนินการ Splat คู่ซึ่งมีให้ตั้งแต่ Ruby 2.0:
h = { a: 1, b: 2 }
h = { **h, c: 3 }
p h
# => {:a=>1, :b=>2, :c=>3}