2012-02-28 15 views
9

Genelde Ruby'de bazı pahalı hesaplamaları önbelleğe almak ya da bir görüntüye geçiş yaptığım bir şey oluşturmak için genellikle kendim için bir arama tablosu oluşturmakta bulunuyorum. Bunun için kısa, okunabilir bir deyim olmalı, ama bir tane düşünemedik. Mesela benDizili bir hash için Ruby dizisi?

[65, 66, 67, ...] 

başlayıp

{65 => "A", 66 => "B", 67 => "C", ...} 

ile biz düşünmek-çok-güzel-yeterince deyimleri bitirmek istiyorum varsayalım şunlardır:

array = (65..90).to_a 

array.inject({}) {|hash, key| hash[key]=key.chr; hash} 
{}.tap {|hash| array.each {|key| hash[key] = key.chr}} 
Hash[array.zip(array.map{|key| key.chr})] 

Ama Bunların hepsi biraz acı verici: okumak zor, dağınıklığı kolay, niyetinde net değil. Kesinlikle Ruby (ya da bazı Rails yardımcıları) bunun için güzel bir sihir var?

cevap

21

Hash[(65..90).map { |i| [i, i.chr] }] 

hakkında bu oldukça açık ve kendi kendini açıklayan olduğunu düşünüyorum ne. Ayrıca, bu oldukça özel bir görevi çözmenin çok daha basit bir yolu yok. Ruby'nin maalesef Python'daki kavrayışa benzer bir şeyleri yok. İsterseniz, yakın bir şey içeren Facets taşını kullanabilirsiniz:

require 'facets' 
(65..90).mash { |i| [i, i.chr] } 
+1

Wow. Bu şekilde bir dizi dizi çiftinin yorumlanacağını asla tahmin edemezdim. {[65, "A"] => [66, "B"], [67, "C"] => [68, "D"], ...} 'ye dönüşmesini beklerdim. Bu beni biraz korkutuyor, ama yine de kullanacağım. Teşekkürler! –

+3

@William: ['Hash. []'] 'I (http://apidock.com/ruby/Hash/%5B%5D/class) iki biçimde kullanabilirsiniz: 'Hash [anahtar, değer, anahtar, değer, ...] 'veya' Hash [[[anahtar, değer], [anahtar, değer], ...]] 'sayısız üretken anahtar/değer çiftini temsil eden iç diziyle. Ruby'de bunu yapmak için birden fazla şey olduğunu unutmayın: P Ayrıca, fasetleri kullanarak başka bir öneri ekledim. –

+0

Yeterince emin olun. Tam orada dokümanlar. Teşekkürler! Kesinlikle Facets de kontrol edeceğim; harika görünüyor. –

İlgili konular