2012-03-06 29 views
5

benim Yakut kodunu bakınız:ekleme elemanı

h=Hash.new([]) 
h[0]=:word1  
h[1]=h[1]<<:word2 
h[2]=h[2]<<:word3 
print "\nHash = " 
print h 

Çıktı: Ben

Hash = {0=>:word1, 1=>[:word2], 2=>[:word3]} 

Neden ikinci karma elemanı olması bekleniyor ettik

Hash = {0=>:word1, 1=>[:word2, :word3], 2=>[:word2, :word3]} 

(dizi) eklendi?

Sadece 3. hash öğesinin yeni dizi öğesiyle nasıl ekleyebilirim?

+0

olası yinelenen [varsayılan karma değerini değiştirme] (http://stackoverflow.com/questions/9492889/modifying-the-default-hash-:

h = [] h<<:word1 h<<:word2 h<<:word3 print h 

İstenen çıktıyı elde etmek için değer) –

+0

İstediğiniz mantıklı bir senaryoyu bulmakta sorun yaşıyorum. Neden h (2) 'nin [h] [1] ile aynı değere sahip olmasını bekliyorsunuz? – Phrogz

+0

Ooops, üzgünüm Beklediğim sonuçları düzenledim. Yine de cevabı zaten kabul ettim. –

cevap

9

Eğer Yani buydu. Hash.new (tam aynı nesne her eksik anahtarının varsayılan değer olarak kullanılır Hash.new([])o örneğin parametre olarak tek bir değeri arz ve bu istemediğiniz buysa size th almak yukarıda gördüğünüz gibi,

irb(main):001:0> h = Hash.new{ [] } 
#=> {} 
irb(main):002:0> h[0] = :foo 
#=> :foo 
irb(main):003:0> h[1] << :bar 
#=> [:bar] 
irb(main):004:0> h 
#=> {0=>:foo} 

Ancak:.

yerine blok eksik anahtar her istendiğinde çağrılır Hash.new, blok formunu kullanabilirsiniz e değeri ancak bu eksik anahtarın değeri olarak olarak ayarlanmış değil. Yukarıda yaptığınız gibi, değeri sabitlemeniz gerekir. değeri sihirli o anahtarın değeri olarak doğmasına için Çoğu zaman, bunun yerine neyi istiyor ise: Artık

irb(main):005:0> h = Hash.new{ |h,k| h[k] = [] } 
#=> {} 
irb(main):006:0> h[0] = :foo 
#=> :foo 
irb(main):007:0> h[1] << :bar 
#=> [:bar] 
irb(main):008:0> h 
#=> {0=>:foo, 1=>[:bar]} 

sadece biz eksik bir anahtar için sorduğunuzda biz ancak bu geri yepyeni dizi alırım otomatik olarak bizim hash ile dizilimi doldurur böylece h[1] = h[1] << :bar

+0

Vay! Teşekkürler! Gözlerimi açtın! –

0

Yapmak zorunda değilsiniz. Neden Hash için sayısal indeks kullanacaksanız, bunun için bir dizi kullanmıyorsunuz? arasında

h = [] 
h<<:word1 
h<<:word2 
h<<[] 
h[2]<<h[1]<<:word3 
print h