Bagaimana menambahkan hash yang sudah ada di Ruby


102

Berkenaan dengan menambahkan key => valuepasangan ke hash terpopulasi yang ada di Ruby, saya sedang dalam proses mengerjakan Ruby Awal dari Apress dan baru saja menyelesaikan bab hashes.

Saya mencoba menemukan cara paling sederhana untuk mencapai hasil yang sama dengan hash seperti ini dengan array:

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

Jawaban:


189

Jika Anda memiliki hash, Anda dapat menambahkan item ke dalamnya dengan mereferensikannya dengan kunci:

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

Di sini, seperti [ ]membuat array kosong, { }akan membuat hash kosong.

Array memiliki nol atau lebih elemen dalam urutan tertentu, di mana elemen dapat diduplikasi. Hash memiliki nol atau lebih elemen yang diatur berdasarkan kunci , di mana kunci tidak boleh diduplikasi tetapi nilai yang disimpan di posisi tersebut dapat.

Hash di Ruby sangat fleksibel dan dapat memiliki hampir semua jenis kunci yang dapat Anda lemparkan. Ini membuatnya berbeda dari struktur kamus yang Anda temukan dalam bahasa lain.

Penting untuk diingat bahwa sifat spesifik dari kunci hash sering kali penting:

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 mengacaukannya dengan menyediakan HashWithIndifferentAccess yang akan mengonversi secara bebas antara metode pengalamatan Symbol dan String.

Anda juga dapat mengindeks hampir semua hal, termasuk kelas, angka, atau Hash lainnya.

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

hash[Object]
# => true

hash[Hash]
# => false

hash[Array]
# => nil

Hash dapat diubah menjadi Array dan sebaliknya:

# 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"} 

Ketika sampai pada "memasukkan" sesuatu ke dalam Hash, Anda dapat melakukannya satu per satu, atau menggunakan mergemetode untuk menggabungkan hash:

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

Perhatikan bahwa ini tidak mengubah hash asli, tetapi mengembalikan yang baru. Jika Anda ingin menggabungkan satu hash ke hash lainnya, Anda dapat menggunakan merge!metode:

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'}

Seperti banyak metode pada String dan Array, ini !menunjukkan bahwa ini adalah operasi di tempat .


12
Banyak informasi berharga, tetapi kurang formulasi paling dasar seperti yang dijawab oleh @robbrit.
danh

1
Harap edit jawaban Anda untuk benar-benar menjawab pertanyaan yang ditanyakan, sebaiknya di dekat bagian atas. Tidak sopan jika saya melakukannya untuk Anda.
Stephan

@Stephan Menambahkan contoh yang lebih ringkas di bagian atas.
tadman


34

Jika Anda ingin menambahkan lebih dari satu:

hash = {:a => 1, :b => 2}
hash.merge! :c => 3, :d => 4
p hash

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

Saya telah mencoba menerapkan ini dengan yang berikut: x['key'] = "value"namun saya menerima kesalahan. Saya harus menyebutkan saya bekerja dengan string.
Tom

1
Apa kesalahannya? Bisa apa saja kecuali Anda lebih spesifik.
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"} 

Mengembalikan nilai yang digabungkan.

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

Tapi tidak mengubah objek pemanggil

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

Penugasan kembali berhasil.


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

Anda mungkin mendapatkan kunci dan nilai dari input pengguna, sehingga Anda dapat menggunakan Ruby .to_sym dapat mengonversi string menjadi simbol, dan .to_i akan mengonversi string menjadi integer.
Sebagai contoh:

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

Anda dapat menggunakan operator percikan ganda yang tersedia sejak Ruby 2.0:

h = { a: 1, b: 2 }
h = { **h, c: 3 }
p h
# => {:a=>1, :b=>2, :c=>3}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.