Yanıtlar:
Evet, bir fark var. Bunlar yasaldır:
h = { :$in => array }
h = { :'a.b' => 'c' }
h[:s] = 42
ama bunlar değil:
h = { $in: array }
h = { 'a.b': 'c' } # but this is okay in Ruby2.2+
h[s:] = 42
Herhangi bir şeyi anahtar olarak da kullanabilirsiniz, =>
böylece bunu yapabilirsiniz:
h = { C.new => 11 }
h = { 23 => 'pancakes house?' }
ama bunu yapamazsın:
h = { C.new: 11 }
h = { 23: 'pancakes house?' }
JavaScript stili ( key: value
), yalnızca tüm Karma anahtarlarınız "basit" semboller ise yararlıdır (aşağı yukarı eşleşen bir şey /\A[a-z_]\w*\z/i
, ayrıştırıcı AFAIK bu anahtarlar için etiket modelini kullanır).
:$in
Eğer MongoDB kullanıyorsanız Hash stilleri karıştırma bitireceğiz böylece MongoDB kullanırken tarzı sembolleri adil biraz görünür. Ve, h[:k]
sadece tam hashler ( ) yerine belirli Hashes ( ) anahtarlarıyla çalışırsanız h = { ... }
, yine de iki nokta üst üste stilini semboller için kullanmanız gerekir; Ayrıca, Hash'lerin dışında kullandığınız semboller için baştaki iki nokta üst üste stilini kullanmanız gerekir. Tutarlı olmayı tercih ederim, bu yüzden JavaScript stiliyle hiç uğraşmam.
JavaScript stiliyle ilgili bazı sorunlar Ruby 2.2'de düzeltildi. Artık geçerli etiket olmayan sembolleriniz varsa tırnak işaretlerini kullanabilirsiniz, örneğin:
h = { 'where is': 'pancakes house?', '$set': { a: 11 } }
Ancak anahtarlarınız sembol değilse, yine de hashrocket'e ihtiyacınız var.
h[:s] = 42
örneğin bu soruyla ilgili olduğunu düşünüyorsunuz ? Benim düşünceme göre, JavaScript stili ve hashrocket stili, hash öğelerini anahtarlarla ele almakla değil, yalnızca anahtar / değer çifti tanımıyla ilgilidir. Bu nedenle h[s:] = 42
örnek yanıltıcı görünüyor.
h[:s] = 42
notasyonu kullanırsınız. Başka seçenek yok. Anahtar / değer çiftlerini tanımladığınızda, { key: value }
JavaScript stili veya { :key => value }
hashrocket stili seçeneklerine sahip olursunuz. Adresleme senaryosu hala odakta olanla alakalı görünmüyor.
key: "value"
Ruby 1.9'un bir kolaylık özelliğidir; çevrenizin onu destekleyeceğini bildiğiniz sürece, onu kullanmamak için bir neden göremiyorum. İki nokta üst üste yazmak roketten çok daha kolay ve bence çok daha temiz görünüyor. Dönüştürmeyi yapacak bir mücevher olmasına gelince, muhtemelen hayır, ancak dosya manipülasyonunu ve düzenli ifadeleri bilmiyorsanız, sizin için ideal bir öğrenme deneyimi gibi görünüyor.
Karma roketler tarafından atanan Ruby hash-anahtarları, anahtar-değer çiftleri için dizgeleri kolaylaştırabilir ( ör . 's' => x
), Oysa semboller aracılığıyla anahtar ataması ( ör. key: "value"
Veya :key => "value"
) dizelerle atanamaz. Karma-roketler, karma tablolar için özgürlük ve işlevsellik sağlasa da, özellikle dizelerin anahtar olarak kullanılmasına izin verse de, karma tabloların karma anahtarlar olarak sembollerle oluşturulmasına göre uygulama performansı daha yavaş olabilir. Aşağıdaki kaynaklar, hashroketler ve semboller arasındaki herhangi bir farkı netleştirebilir:
key: value
JSON tarzı atamaları, yeni Ruby 1.9 karma sözdizimi bir parçası olan bu sözdizimi Ruby eski sürümleri ile çalışmayacak akılda ayı yüzden. Ayrıca, anahtarlar semboller olacak. Bu iki kısıtlama ile yaşayabilirseniz, yeni karmalar tıpkı eski karmalar gibi çalışır; onları dönüştürmek için (belki de stil dışında) bir neden yok.
Yapmak :key => value
, yapmakla aynı şeydir key: value
ve gerçekten sadece bir kolaylıktır. Bunu kullanan başka diller görmedim =>
, ancak Javascript gibi diğerleri key: value
Hash eşdeğeri veri türlerinde bunu kullanıyor.
Bir mücevherin hashlerinizi yazma şeklinizi dönüştürmesine gelince, sadece mevcut projeniz için bunu yapma şeklinize bağlı kalırım.
* key: value
Anahtarı kullanırken bir sembol olacağını ve o anahtarda saklanan değere erişmek için bir foo
hash'in hala olacağını unutmayın foo[:key]
.
=>
. Perl'den büyük ölçüde esinlenen Ruby'nin sözdizimini Perl'den ödünç aldığını tahmin ediyorum :)
h = { 'a.b': 'c' }
Ruby 2.2.0 itibariyle artık yasaldır. Bkz bugs.ruby-lang.org/issues/4276