Ruby - обновить ключи хеша для удаления пробелов - PullRequest
0 голосов
/ 23 мая 2018

Я хотел бы удалить пробелы из моего хэша, поэтому, если у меня есть

{"my hash key": 12}

Я хотел бы получить

{"myhashkey": 12}

Я нашел несколько способов удалить значения, но есть проблема сделать это на ключах.Когда я попытался

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

, я получил ошибку:

RuntimeError: can't modify frozen String

, и если использовать только gsub (без '!'), Он работает нормально, но не работает.

Так, каков наилучший способ достичь этого?Спасибо!

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Вы можете использовать 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}

Требуется преобразование to_s / to_sym, поскольку Symbol не реализует delete.Вы можете опустить его, если ваши ключи на самом деле являются строками:

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

my_hash.transform_keys { |k| k.delete(' ') }
#=> {:myhashkey=>12}
0 голосов
/ 23 мая 2018

Попробуйте следующее:

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

По сути, вы сопоставляете свой хеш с новым массивом, где вы удаляете все пробелы (это то, что делает key.to_s.delete(' ')), и вы конвертируете его обратно в хешс .to_h:)

РЕДАКТИРОВАТЬ

Только что увидел ответ @ stephen, который использует transform_keys, гораздо более простой метод, который был введен в Ruby 2.5.

Однако я все равно оставлю свой ответ на тот случай, если кто-то, использующий предыдущую версию Ruby, наткнется на это

0 голосов
/ 23 мая 2018

Ключи в хэше заморожены (как говорится в сообщении об ошибке) и, следовательно, их нельзя изменить inplace .Новый хеш должен быть создан с новыми ключами:

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

NB! есть ловушка: вы можете потерять некоторые значения!

{"a b c" => 42, "abc" => :foo}.
  map { |k, v| [k.delete(' '), v] }.to_h
#⇒ {"abc"=>:foo}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...