264 votes

Meilleur moyen pour convertir des chaînes de symboles dans le hachage

Quel est le moyen (le plus rapide/plus propre/simple) pour convertir toutes les clés dans une table de hachage dans des chaînes de symboles en Ruby ?

Ce serait très pratique lors de l’analyse de YAML.

Je voudrais pouvoir utiliser :

Plutôt que :

311voto

Sai Points 2285

Voici une meilleure méthode, si vous utilisez des Rails :

params. symbolize_keys

La fin.

Si vous ne l’êtes pas, juste arnaquer leur code (c’est également dans le lien) :

289voto

Sarah Mei Points 10673

Si vous voulez un bon mot,

copiera le hachage dans un nouveau avec les touches symbolisé.

115voto

jrgm Points 641

Pour le cas spécifique de YAML en Ruby, si les clés commencent par ':', ils seront automatiquement interné comme des symboles.

besoin d'un yaml'
require 'pp'
yaml_str = "
connexions:
 - l'hôte: host1.example.com
 port: 10000
 - l'hôte: host2.example.com
 port: 20000
"
yaml_sym = "
:connexions:
 - :hôte: host1.example.com
 :port: 10000
 - :hôte: host2.example.com
 :port: 20000
"
pp yaml_str = YAML.charge(yaml_str)
met yaml_str.keys.first.class
pp yaml_sym = YAML.charge(yaml_sym)
met yaml_sym.keys.first.class

Sortie:

# /opt/ruby 1.8.6-p287/bin/ruby ~/test.rb
{"connexions"=>
 [{"port"=>10000, "l'hôte"=>"host1.example.com"},
 {"port"=>20000, "accueil"=>"host2.example.com"}]}
Chaîne
{:connexions=>
 [{:port=>10000, :host=>"host1.example.com"},
 {:port=>20000, :host=>"host2.example.com"}]}
Symbole

64voto

Michael Barton Points 957

Encore plus laconique :

62voto

Tilo Points 13833

si vous êtes à l'aide de Rails, c'est beaucoup plus simple - vous pouvez utiliser un HashWithIndifferentAccess et l'accès aux clés à la fois comme une Chaîne de caractères et de Symboles:

my_hash.with_indifferent_access 

voir aussi:

http://api.rubyonrails.org/classes/ActiveSupport/HashWithIndifferentAccess.html


Ou vous pouvez utiliser le génial "Facettes de Ruby Gem, qui contient un grand nombre d'extensions de Ruby et de la Bibliothèque Standard classes.

  require 'facets'
  > {'some' => 'thing', 'foo' => 'bar'}.symbolize_keys
    =>  {:some=>"thing", :foo=>"bar}

voir aussi: http://rubyworks.github.io/rubyfaux/?doc=http://rubyworks.github.io/facets/docs/facets-2.9.3/core.json#api-class-Hash

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X