298 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 :

361voto

Sarah Mei Points 10673

Si vous voulez un bon mot,

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

321voto

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

116voto

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

69voto

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

66voto

Michael Barton Points 957

Encore plus laconique :

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