2010-06-30 13 views
5

Ben bu yüzden Ruby benzer bir şey yapmak için bir yolu var mı atamak vePHP'de olduğu gibi Ruby'de çok boyutlu karma dizisinin otomatik olarak başlatılması mümkün mü?

unset($a); // just to show that there is no variable $a 
$a['settings']['system']['memory'] = '1 Gb'; 
$a['settings']['system']['disk space'] = '100 Gb'; 

tarafından bir karma başlatabilir çok boyutlu diziler, PHP ile çalışmak için alışkınım? Ya da önce tüm boyutları başlatmam ve ardından değerleri atamam gerekiyor. İhtiyacım olanı yapmamı sağlayacak gelişmiş bir Hash tanımlamak mümkün mü? Bunu nasıl yaptın?

class AutoHash < Hash 
    def initialize(*args) 
    super() 
    @update, @update_index = args[0][:update], args[0][:update_key] unless args.empty? 
    end 

    def [](k) 
    if self.has_key?k 
     super(k) 
    else 
     AutoHash.new(:update => self, :update_key => k) 
    end 
    end 

    def []=(k, v) 
    @update[@update_index] = self if @update and @update_index 
    super 
    end 
end 
:


Güncelleştirme Douglas (aşağıya bakınız) tarafından önerilen çözelti ek olarak

, Brian Schröäer Hash sınıfı için bir uzantı önermiştir ettiği bir thread on the subject bulduk

Öğe değeri yalnızca talep edildiğinde, eksik bir karma öğe istenmeyen şekilde oluşturulduğunda, sorunun çözülmesini sağlar. a['key'].


Bazı ek referanslar

  1. ruby hash autovivification (facets)
  2. http://trevoke.net/blog/2009/11/06/auto-vivifying-hashes-in-ruby/
  3. http://www.eecs.harvard.edu/~cduan/technical/ruby/ycombinator.shtml
+0

PHP'li bir adamım ve Ruby hakkında çok az şey biliyorum, ama bence bu, PHP'nin diğer dillere aktarılmaması gereken korkunç özelliklerinden biri. :) (Neden böyle bir durumda bunu isteyeceğini anladım rağmen) –

cevap

7

bu deneyin:

def hash_with_default_hash 
    Hash.new { |hash, key| hash[key] = hash_with_default_hash } 
end 

a = hash_with_default_hash 

Anahtar yoksa, bloğun sonucu varsayılan değer olarak kullanılır. Bu durumda, varsayılan değer aynı zamanda sağlama değerlerini varsayılan değerleri olarak kullanan bir karmadır.

+1

Bir çekicilik gibi çalışır! Teşekkürler, Douglas – Andrei

+0

Dilek bir şey daha var - sadece '[' anahtar '] 'kalem değerini kontrol edersem, o zaman,' anahtar 'anahtarıyla yeni bir öğe var olmaması durumunda oluşturulacaktır. Böyle bir davranışı nasıl önleyebiliriz? – Andrei

+1

Hash # has_key'in peşindesiniz? http://ruby-doc.org/core/classes/Hash.html#M002883 – Douglas

İlgili konular