Ruby'de mevcut bir hash'e nasıl eklenir


102

key => valueRuby'de mevcut bir doldurulmuş hash'e bir çift ekleme ile ilgili olarak , Apress'in Beginning Ruby üzerinden çalışma sürecindeyim ve hash bölümünü yeni bitirdim.

Dizilerde olduğu gibi hashlerle aynı sonuçları elde etmenin en basit yolunu bulmaya çalışıyorum:

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

Yanıtlar:


190

Bir hash'iniz varsa, anahtarla referans vererek ona öğeler ekleyebilirsiniz:

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

Burada, [ ]boş bir dizi oluşturduğu gibi , { }boş bir karma oluşturacaktır.

Diziler, belirli bir sırada sıfır veya daha fazla öğeye sahiptir, burada öğeler çoğaltılabilir. Kareler, anahtara göre düzenlenmiş sıfır veya daha fazla öğeye sahiptir ; burada anahtarlar yinelenemez ancak bu konumlarda saklanan değerler olabilir.

Ruby'deki hasarlar çok esnektir ve ona atabileceğiniz neredeyse her türden anahtarlara sahip olabilir. Bu, onu diğer dillerde bulduğunuz sözlük yapılarından farklı kılar.

Bir hash anahtarının belirli doğasının genellikle önemli olduğunu akılda tutmak önemlidir:

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, Symbol ve String adresleme yöntemleri arasında serbestçe dönüşüm yapacağı HashWithIndifferentAccess sağlayarak bunu biraz karıştırır.

Ayrıca sınıflar, sayılar veya diğer Hash'lar dahil hemen hemen her şeyi dizine alabilirsiniz.

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

hash[Object]
# => true

hash[Hash]
# => false

hash[Array]
# => nil

Kareler Dizilere dönüştürülebilir ve bunun tersi de geçerlidir:

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

Bir karma "ekleme" söz konusu olduğunda, bunu birer birer yapabilir veya mergekarmaları birleştirmek için yöntemi kullanabilirsiniz :

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

Bunun orijinal hash'i değiştirmediğini, bunun yerine yeni bir tane döndürdüğünü unutmayın. Bir hash'i diğeriyle birleştirmek istiyorsanız, merge!yöntemi kullanabilirsiniz :

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

String ve Array üzerindeki birçok yöntem gibi !, bunun yerinde bir işlem olduğunu gösterir.


12
Pek çok değerli bilgi, ancak @robbrit tarafından basitçe yanıtlandığı gibi en temel formülasyondan yoksun.
danh

1
Lütfen yanıtınızı sorulan soruyu gerçekten yanıtlayacak şekilde düzenleyin, tercihen üst kısma yakın bir yerde. Bunu senin için yapmak kabalık olur.
Stephan

@Stephan Üst kısma daha kısa bir örnek ekledi.
tadman


34

Birden fazla eklemek istiyorsanız:

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

Bunu şu şekilde uygulamaya çalıştım: x['key'] = "value"ancak hata alıyorum. Dizelerle çalıştığımı söylemeliyim.
Tom

1
Hata nedir? Daha spesifik olmadığınız sürece herhangi bir şey olabilir.
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"} 

Birleştirilmiş değeri döndürür.

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

Ancak arayan nesnesini değiştirmez

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

Yeniden atama hile yapar.


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

Anahtarınızı ve değerinizi kullanıcı girdisinden alabilirsiniz, böylece Ruby'yi kullanabilirsiniz .to_sym bir dizeyi bir sembole dönüştürebilir ve .to_i bir dizeyi tam sayıya dönüştürebilir.
Örneğin:

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

Ruby 2.0'dan beri mevcut olan çift uyarlama operatörünü kullanabilirsiniz:

h = { a: 1, b: 2 }
h = { **h, c: 3 }
p h
# => {:a=>1, :b=>2, :c=>3}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.