2013-09-27 22 views
7

Anahtarın bir dizge olduğu ve değerin dizenin bir dizisi olduğu bir hash'um var. Böyle bir şey istiyorum: Ben bu uygulamaya sadece bir karma ve bir dizi varRuby'de Dizilerin Çatısı

{"k1"=>["v1", "v2"], "k2"=>["v3", "v4"]} 

.

hash1 = Hash.new 
arr = Array.new 
arr.push "v1" 
arr.push "v2" 
hash1["k1"] = arr 

arr = [] # ** This is the only changed line. Now k1's value is correct. ** 
arr.push "v3" 
arr.push "v4" 
hash1["k2"] = arr 
puts hash1 
#Output: {"k1"=>["v1", "v2"], "k2"=>["v3", "v4"]} (which I wanted) 

birisi bu nasıl oluyor bana lütfen açıklayabilir:

hash1 = Hash.new 
arr = Array.new 
arr.push "v1" 
arr.push "v2" 
hash1["k1"] = arr 

#hash is like this: {"k1"=>["v1", "v2"] 
#Now I clear the array to read the new values 

arr. clear 
arr.push "v3" 
arr.push "v4" 
hash1["k2"] = arr 
puts hash1 

#Output: {"k1"=>["v3", "v4"], "k2"=>["v3", "v4"]} 
#Notice that k1's value also got updated 

Sonra bir satır değişti: Böyle bir şey kodlanmış mı? Ruby için çok yeni. İdeal olarak, bu sorunu kodlamanın doğru yolu nedir?

+2

"Bunu uygulamak için yalnızca bir karma ve bir dizim var." İkinci örneğinizde değil. Orada iki diziniz var. – Ajedi32

+2

'{}' hemen hemen her zaman Hash.new' ve '[]' Array.new' için tercih edilir. – tadman

+0

@tadman neden tercih edilir? Okunabilirlik için mi? ya da başka faydaları var mı? –

cevap

8

Bu size göstermelidir (object_id arkadaşınız). (Farklılıkları görmeyi kolaylaştırmak için Object_id'de bir alt çizgi ekledim.)

hash1 = {}   # => {} 
arr = ["v1", "v2"] # => ["v1", "v2"] 
arr.object_id   # => 7016637_4343580 
hash1["k1"] = arr  # => ["v1", "v2"] 
hash1     # => {"k1"=>["v1", "v2"]} 
hash1["k1"].object_id # => 7016637_4343580 
arr.clear    # => [] 
arr.object_id   # => 7016637_4343580 
arr << "v3" << "v4" # => ["v3", "v4"] 
arr.object_id   # => 7016637_4343580 
hash1["k2"] = arr  # => ["v3", "v4"] 
hash1     # => {"k1"=>["v3", "v4"], "k2"=>["v3", "v4"]} 
hash1["k1"].object_id # => 7016637_4343580 
hash1["k2"].object_id # => 7016637_4166580 

arr = []    # => [] 
arr.object_id   # => 7016637_4036500 
arr = ["v5", "v6"] # => ["v5", "v6"] 
arr.object_id   # => 7016637_3989880 
hash1     # => {"k1"=>["v3", "v4"], "k2"=>["v3", "v4"]} 
hash1["k1"].object_id # => 7016637_4343580 
hash1["k2"] = arr  # => ["v5", "v6"] 
hash1     # => {"k1"=>["v3", "v4"], "k2"=>["v5", "v6"]} 
hash1["k1"].object_id # => 7016637_4343580 
hash1["k2"].object_id # => 7016637_3989880 
+0

güzel açıklama. Eğer hash'ımı v1 veya v2 değeriyle sıralamak istersem, nasıl yapmalıyım? 'hash1.sort_by {| k, v | v.first} '#undefined method '[]' nil için: NilClass ' hash1.sort_by {| k, v | v [0]} '#undefined method '[]' nil için: NilClass – Aparichith

+0

Sorunu tam olarak anlamıyorum. Lütfen "hash1" örneğiyle bir başka yorum bırakın ve karma sonucunun ne olmasını istiyorsunuz. –

+0

, bu '[{" a "=> [576, 236]}, {" z "=> [348, 4859]}, {" b "=> [174, 98] gibi bir dizi karmaşayı dikkate alır. } {"t" => [165, 145]}, {"u" => [97, 184]}, {"m" => [595, 374]}, {"g" = > [61, 86]}] ' Her bir anahtar için değer toplamını kullanarak karma dizilerimi nasıl sıralamalıyım?Bu '[{ "Z"=> [348, 4859]}, { "a"=> [576, 236]}, { "m"=> [595, 374]}, gibi {"t" => [165, 145]}, {"u" => [97, 184]}, {"b" => [174, 98]}, {"g" => [61 , 86]}] ' – Aparichith

3

Eğer karma kaydedilmiş dizi hala arr kadar net arr.clear yapıyor ve temizlemek ve aynı zamanda karma kayıtlı birine yeni değerler eklemek istiyorum arr.push kullanılarak başvurulmaktadır. Ancak, arr = [], arr yapılıyorsa, karma olarak kaydedilmiş olandan farklı yeni bir diziye başvurulacaktı.

Ve eğer sadece birlikte karma yeni bir dizi ekleyebilirsiniz: ne olup bittiğini

hash1["k2"] = ["v3", "v4"] 

Ya

hash1["k2"] = %w[v3 v4] 
+2

Cevabı ekleyerek çalışmayı görebilmeniz, bunu 'arr', 'arr.object_id' kodunuzda yapın, 'temiz' seçeneğini kullandığınızda bir numara alacaksınız ve kimliği tekrar kontrol edin, yine de (yine de) aynı referans), 'arr = [] 'ile aynı ada sahip yeni bir nesne oluşturduğunuzda, eski olanı geçersiz kılarsınız, arr.object_id ile kontrol edin ve farklı bir kimlik numaranız olacak demektir. nesne :) – Gerep

İlgili konular