": Key =>" value "" ve "key:" value "" hash gösterimleri arasında herhangi bir fark var mı?


124

:key => "value"(Hashrocket) ve key: "value"(Ruby 1.9) gösterimleri arasında herhangi bir fark var mı ?

Değilse, key: "value"notasyonu kullanmak istiyorum . Dan dönüştürmek için bana yardımcı olan bir mücevher var mıdır :x =>için x:gösterimler?

Yanıtlar:


153

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).

:$inEğ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 = { 'a.b': 'c' }Ruby 2.2.0 itibariyle artık yasaldır. Bkz bugs.ruby-lang.org/issues/4276
B Seven

@BSeven: Teşekkürler, diğer büyük hashrocket cevabımı bir süre önce güncelledim ama bunu kaçırdım.
mu çok kısa

Neden 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.
Nic Nilov

@NicNilov Bu önemlidir çünkü JavaScript stili, Hash anahtarları gibi sembollerle ilgilidir ve izin verilen gösterimler kafa karıştırıcı bir şekilde içeriğe bağlıdır.
mu çok kısa

Kabul edemiyorum. Bir hash slotunu sembol bazında adreslerken her zaman h[:s] = 42notasyonu 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.
Nic Nilov

11

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.


5

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:


4

key: valueJSON 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.


5
Not: Öyle değil , JavaScript tarzı, JSON tarzı. JSON, anahtarların alıntılanmasını gerektirir.
mu çok kısa

1

Yapmak :key => value, yapmakla aynı şeydir key: valueve gerçekten sadece bir kolaylıktır. Bunu kullanan başka diller görmedim =>, ancak Javascript gibi diğerleri key: valueHash 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: valueAnahtarı kullanırken bir sembol olacağını ve o anahtarda saklanan değere erişmek için bir foohash'in hala olacağını unutmayın foo[:key].


Hem Perl hem de PHP kullanır =>. Perl'den büyük ölçüde esinlenen Ruby'nin sözdizimini Perl'den ödünç aldığını tahmin ediyorum :)
Daniel Serodio
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.