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

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

Si non, alors je voudrais utiliser la key: "value" notation key: "value" . Y a-t-il un petit bijou qui m’aide à convertir de :x => à x: notations?

Oui, il y a une différence. Ce sont légales:

 h = { :$in => array } h = { :'ab' => '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 en tant que clé avec => pour pouvoir le faire:

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

mais tu ne peux 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 , l’parsingur utilise ses motif d’étiquette pour ces touches).

Les symboles de style :$in apparaissent assez bien lors de l’utilisation de MongoDB, donc vous finirez par mélanger les styles de hachage si vous utilisez MongoDB. Et, si vous travaillez avec des clés spécifiques de Hash ( h[:k] ) plutôt que des hashes entiers ( h = { ... } ), vous devrez toujours utiliser le style deux-points-premier pour les symboles; Vous devrez également utiliser le style de deux points-majuscules pour les symboles que vous utilisez en dehors des zones de hachage. Je préfère être cohérent, donc je ne me soucie pas du tout du style JavaScript.

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

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 beaucoup plus facile de taper un côlon qu’une fusée, et je pense que cela semble beaucoup plus propre. En ce qui concerne la conversion, probablement pas, mais cela semble être une expérience d’apprentissage idéale si vous ne connaissez pas déjà la manipulation de fichiers et les expressions régulières.

La key: value affectations de style JSON font partie de la nouvelle syntaxe de hachage Ruby 1.9. Gardez à l’esprit que cette syntaxe ne fonctionnera pas avec les anciennes versions de Ruby. De plus, les clés vont être 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.

Les touches de hachage Ruby atsortingbuées par des hash-rockets peuvent faciliter les chaînes pour les paires clé-valeur ( par exemple, 's' => x ), tandis que l’atsortingbution de clé via des symboles ( par exemple, key: "value" ou :key => "value" ) atsortingbué avec des chaînes. Bien que les tables de hachage fournissent de la liberté et des fonctionnalités pour les tables de hachage, en permettant spécifiquement les chaînes comme clés , les performances des applications 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:

  • Les symboles de Ryan Sobol dans Ruby
  • Ruby Hashes Exaplected par Erik Trautman

Faire :key => value est la même chose que faire key: value , et n’est qu’une solution pratique. Je n’ai pas vu d’autres langages utilisant le => , mais d’autres comme Javascript utilisent la key: value dans leurs types de données équivalents à Hash.

En ce qui concerne un bijou pour convertir la manière dont vous avez écrit vos hashes, 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 foo hash serait toujours foo[:key] .