Y a-t-il une différence entre les notations de hachage `: key =>“ value ”` et `key:“ value ”`?

124

Y a-t-il une différence entre :key => "value"(hashrocket) etkey: "value" (Ruby 1.9)?

Sinon, j'aimerais utiliser la key: "value"notation. Y at - il un petit bijou qui me permet de convertir de :x =>la x:notation?

AdamNYC
la source

Réponses:

153

Oui, il y a une différence. Ceux-ci sont légaux:

h = { :$in => array }
h = { :'a.b' => 'c' }
h[:s] = 42

mais ce ne sont pas:

h = { $in: array }
h = { 'a.b': 'c' } # but this is okay in Ruby2.2+
h[s:] = 42

Vous pouvez également utiliser n'importe quoi comme clé avec =>pour pouvoir le faire:

h = { C.new => 11 }
h = { 23 => 'pancakes house?' }

mais vous ne pouvez pas faire ça:

h = { C.new: 11 }
h = { 23: 'pancakes house?' }

Le style JavaScript ( key: value) n'est utile que si toutes vos clés de hachage sont des symboles "simples" (plus ou moins quelque chose qui correspond /\A[a-z_]\w*\z/i, AFAIK l'analyseur utilise son modèle d'étiquette pour ces clés).

Les :$insymboles de style apparaissent un peu lors de l'utilisation de MongoDB, vous finirez donc par mélanger les styles de hachage si vous utilisez MongoDB. Et, si jamais vous travaillez avec des clés spécifiques de Hashes ( h[:k]) plutôt que juste des hachages entiers ( h = { ... }), vous devrez toujours utiliser le style deux-points pour les symboles; vous devrez également utiliser le style deux-points de début pour les symboles que vous utilisez en dehors des hachages. Je préfère être cohérent donc je ne me soucie pas du tout du style JavaScript.

Certains des problèmes avec le style JavaScript ont été corrigés dans Ruby 2.2. Vous pouvez désormais utiliser des guillemets si vous avez des symboles qui ne sont pas des libellés valides, par exemple:

h = { 'where is': 'pancakes house?', '$set': { a: 11 } }

Mais vous avez toujours besoin du hashrocket si vos clés ne sont pas des symboles.

mu est trop court
la source
h = { 'a.b': 'c' }est maintenant légal à partir de Ruby 2.2.0. Voir bugs.ruby-lang.org/issues/4276
B Seven
@BSeven: Merci, j'ai mis à jour mon autre grande réponse hashrocket il y a quelque temps, mais j'ai raté celle-ci.
mu est trop court
Pourquoi pensez-vous que l' h[:s] = 42exemple se rapporte à cette question? À mon avis, le style JavaScript par rapport au style hashrocket n'est pertinent que pour la définition de la paire clé / valeur de hachage, et non pour traiter les éléments de hachage par des clés. Par conséquent, l' h[s:] = 42exemple semble trompeur.
Nic Nilov
@NicNilov C'est pertinent car le style JavaScript concerne les symboles en tant que clés de hachage et les notations autorisées dépendent du contexte, ce qui prête à confusion.
mu est trop court
Je ne peux pas être d'accord. Lors de l'adressage d'un emplacement de hachage par symbole, vous utilisez toujours la h[:s] = 42notation. Il n'y a pas d'autre option. C'est lorsque vous définissez des paires clé / valeur que vous avez des options de { key: value }style JavaScript ou de { :key => value }style hashrocket. Le scénario d'adressage ne semble toujours pas pertinent pour ce qui est en jeu.
Nic Nilov
11

key: "value"est une fonctionnalité pratique de Ruby 1.9; tant que vous savez que votre environnement le supportera, je ne vois aucune raison de ne pas l'utiliser. Il est juste beaucoup plus facile de taper un colon qu'une fusée, et je pense que cela semble beaucoup plus propre. Quant à la possibilité de faire la conversion, probablement pas, mais cela semble être une expérience d'apprentissage idéale pour vous, si vous ne connaissez pas déjà la manipulation de fichiers et les expressions régulières.

rangs rejoints
la source
5

Hachage clés Ruby attribuées par hachage roquettes peuvent faciliter les chaînes de paires de valeurs de clés ( par exemple . 's' => x) Alors que l' affectation des touches par des symboles ( par exemple key: "value" , ou :key => "value") ne peut pas être attribué à des chaînes. Bien que les fusées de hachage fournissent la liberté et la fonctionnalité pour les tables de hachage, autorisant spécifiquement les chaînes comme clés , les performances de l'application peuvent être plus lentes que si les tables de hachage devaient être construites avec des symboles comme clés de hachage. Les ressources suivantes peuvent être en mesure de clarifier les différences entre les hashrockets et les symboles:

alexanderjsingleton
la source
4

Les key: valueaffectations de style JSON font partie de la nouvelle syntaxe de hachage Ruby 1.9, gardez donc à l'esprit que cette syntaxe ne fonctionnera pas avec les anciennes versions de Ruby. De plus, les clés seront des symboles. Si vous pouvez vivre avec ces deux contraintes, les nouveaux hachages fonctionnent exactement comme les anciens hachages; il n'y a aucune raison (autre que le style, peut-être) de les convertir.

sczizzo
la source
5
PS: Ce n'est pas du style JSON, c'est du style JavaScript. JSON nécessite que les clés soient citées.
mu est trop court
1

Faire :key => valueest la même chose que faire key: value, et ce n'est vraiment qu'une commodité. Je n'ai pas vu d'autres langages qui utilisent le =>, mais d'autres comme Javascript utilisent le key: valuedans leurs types de données équivalents à Hash.

En ce qui concerne un bijou pour convertir la façon dont vous avez écrit vos hachages, je m'en tiens simplement à la façon dont vous le faites pour votre projet actuel.

* Notez qu'en utilisant key: valuela clé sera un symbole, et pour accéder à la valeur stockée à cette clé dans un foohachage serait toujours foo[:key].

Charles
la source
Les deux utilisent Perl et PHP =>. Je suppose que Ruby, fortement inspiré par Perl, a emprunté la syntaxe de Perl :)
Daniel Serodio