2008-10-04 12 views
34

Ruby'de karma karmalarının oluşturulması, uygun iki (veya daha fazla) boyutlu arama yapılmasına olanak tanır. Ancak, birini eklerken daima ilk indeksin karmada var olup olmadığını kontrol etmelisiniz. Örneğin:Ruby'de Hashes Idiom'un Hashes?

h = Hash.new 
h['x'] = Hash.new if not h.key?('x') 
h['x']['y'] = value_to_insert 

Yeni Hash otomatik olarak oluşturulur nerede aşağıdakileri yapmak tercih olacaktır: Benzer şekilde

h = Hash.new 
h['x']['y'] = value_to_insert 

, ilk endeks zaten var olmayan bir değer aranırken, '[]' hatası için tanımlanmamış bir yöntem almak yerine nil döndürülürse tercih edilebilir.

looked_up_value = h['w']['z'] 

biri bu davranışı vardır, ancak bu işin gerçekleştirilmesi için mevcut bir Ruby deyim vardır bir Hash sarıcı sınıf oluşturabilir? Tabii

h = Hash.new { |h, k| h[k] = Hash.new } 

, bu yinelemeli yapılabilir:

+0

karma var mı belirli bir derinlikten sonra 0 dönecek olan karma deyimlerden mi? (Ben bir şeyler sayıyorum ve kullanıyorum h [: foo] [: bar] [: baz] + = 1) –

cevap

54

Sen Hash.new fonksiyonu sorgulanan değeri henüz var olmayan durumda varsayılan bir değer elde etmek için yürütülen bir blok iletebilirsiniz.

/DÜZENLEME: Vay, bu soruyu yanıtlayan an article var. Bütünlük adına

, burada keyfi derinlik karmaları için makalesinden çözüm:

hash = Hash.new(&(p=lambda{|h,k| h[k] = Hash.new(&p)})) 

Kredi Data Noise gelen Kent gidin.

+1

Vay. Bu etkileyici. –

+0

Ölü bağlantı. Etkileyici bir çözüm olsa da. –

+1

Ölü bağlantı şu adreste değiştirildi http://inquirylabs.com/blog2009/2006/09/20/ruby-hashes-of-arbitrary-depth/ – Autodidact

4

Otomatikleştirme, adı verildiği gibi, hem bir nimet hem de bir lanettir. Sorun şu ki, tanımlanmadan önce bir değere "bakarsanız", bu boş hash ile yuvaya sıkışmış olursunuz ve daha sonra bunu eritmeniz gerekir.

Eğer anarşi biraz sakıncası yoksa, bunu sorgulamak gibi beklenen yapıyı oluşturmak sağlayacak stil bildirimlerini veya-eşittir her zaman sadece reçel yapabilirsiniz:

((h ||= { })['w'] ||= { })['z'] 
İlgili konular