web-dev-qa-db-fra.com

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

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

Sinon, je voudrais utiliser key: "value" notation. Existe-t-il un joyau qui m'aide à convertir de :x => à x: notations?

116
AdamNYC

Oui, il y a une différence. Ce 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 que vous puissiez faire ceci:

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

Le :$in les symboles de style apparaissent assez bien lorsque vous utilisez 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 Hashs (h[:k]) plutôt que des hachages entiers (h = { ... }), vous devrez toujours utiliser le style deux points pour les symboles; vous devrez également utiliser le style deux-points pour les symboles que vous utilisez en dehors de Hashs. 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 maintenant utiliser des guillemets si vous avez des symboles qui ne sont pas des étiquettes 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.

145
mu is too short

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 deux-points 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.

10
ranksrejoined

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

4
sczizzo

Les clés de hachage Ruby attribuées par les fusées de hachage peuvent faciliter les chaînes pour les paires clé-valeur ( par exemple. 's' => x) tandis que l'affectation des touches via les symboles ( par exemplekey: "value" ou :key => "value") ne peut pas être affecté avec des chaînes. Bien que les hachettes-roquettes offrent 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 lent 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:

3
alexanderjsingleton

Faire :key => value revient à faire key: value, et c'est vraiment juste une commodité. Je n'ai pas vu d'autres langues utilisant le =>, mais d'autres comme Javascript utilisent le key: value dans leurs types de données équivalents à Hash.

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

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

1
Charles