Je voudrais supprimer les espaces blancs de mon hachage, donc si j'ai

{"my hash key": 12}

Je voudrais obtenir

{"myhashkey": 12}

J'ai trouvé des moyens de supprimer les valeurs, mais j'ai un problème pour le faire sur les clés. Quand j'ai essayé

 my_hash.each_key{|k| k.gsub!(' ', '')}

J'ai eu l'erreur:

RuntimeError: can't modify frozen String

Et si vous n'utilisez que gsub (sans '!'), il fonctionne bien, mais ne fonctionne pas.

Alors, quelle est la meilleure façon d'y parvenir? Merci!

2
Ronan Lopes 23 mai 2018 à 17:56

3 réponses

Meilleure réponse

Les clés dans les hachages sont figées (comme l'indique le message d'erreur) et ne peuvent donc pas être modifiées sur place . Le nouveau hachage doit être construit avec de nouvelles clés:

{"my hash key" => 12}.map { |k, v| [k.delete(' '), v] }.to_h
#⇒ {"myhashkey"=>12}

NB! il y a un piège: vous risquez de perdre certaines valeurs!

{"a b c" => 42, "abc" => :foo}.
  map { |k, v| [k.delete(' '), v] }.to_h
#⇒ {"abc"=>:foo}
6
Aleksei Matiushkin 23 mai 2018 à 15:05

Vous pouvez utiliser transform_keys:

my_hash = { 'my hash key': 12 }
#=> {:"my hash key"=>12}

my_hash.transform_keys { |k| k.to_s.delete(' ').to_sym }
#=> {:myhashkey=>12}

La conversion to_s / to_sym est nécessaire car Symbol ne met pas en œuvre delete. Vous pouvez l'omettre si vos clés sont en fait des chaînes:

my_hash = { 'my hash key' => 12 }
#=> {:"my hash key"=>12}

my_hash.transform_keys { |k| k.delete(' ') }
#=> {:myhashkey=>12}
5
Stefan 23 mai 2018 à 15:08

Essayez ce qui suit:

h = { "my hash key": 12 }
h.map {|key, value| [key.to_s.delete(' '), value] }.to_h

Fondamentalement, vous mappez votre hachage à un nouveau tableau où vous supprimez tous les espaces blancs (c'est ce que fait le key.to_s.delete(' ')), et vous le reconvertissez en hachage avec .to_h :)

MODIFIER

Je viens de voir la réponse de @ stephen, qui utilise transform_keys, une méthode beaucoup plus simple qui a été introduite dans Ruby 2.5.

Cependant, je vais toujours laisser ma réponse, au cas où quelqu'un utilisant une version précédente de Ruby tomberait dessus

2
ldeld 23 mai 2018 à 15:18