2016-12-20 2 views
0

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

Ключи: "VoLTE QCI1 Сбой установки%" "VoLTE QCI1 Неудачи установки" "VoLTE QCI1 Попытки установки"

@@parsed_items.each_key {|key| 
key.gsub(/\s/,'_') 
ap key 
    } 

Ожидаемый результат: "VoLTE_QCI1_Setup_Failure%" "VoLTE_QCI1_Setup_Failures" «VoLTE_QCI1_Setup_Attempts»

Токовый выход: «VoLTE QCI1 Сбой установки%» «Отказы установки VoLTE QCI1» «VoLTE QCI1 попытки установки»

+0

'each_key' возвращает хэш. Что возвращает '@@ parsed_items' после применения вашего кода? –

+0

{ "VoLTE QCI1 Сбой установки%" =>»0,239" , "VoLTE QCI1 Неудачи Настройка"=> "15", " VoLTE QCI1 Попытки установки"=> "6274", "QCI5 Сбой установки%" => ".065", } – ssharma

ответ

3

Если вы хотите повторно ключ весь ваш хэш, вы, возможно, придется восстановить его:

@@parsed_items = Hash[ 
@@parsed_items.map do |key, value| 
    [ key.gsub(/\s/,'_'), value ] 
end 
] 

Метод each_key игнорирует все, что возвращает ваш блок, он просто выдает его, поэтому никаких изменений в хэш не происходит.

Вы также можете написать вспомогательный метод для де-подчеркивания произвольных хэшей, который также делает это.

Обратите внимание, что использование переменных уровня класса @@ часто является признаком смешанных проблем. Методы экземпляров не должны ковыряться в данных класса, это считается приватным. Если вам нужен доступ к нему, выведите методы на уровне класса, которые дадут вам чистый интерфейс.

+1

Или '@@ parsed_items.map {...} .to_h'. –

+0

Спасибо. Я повторил Key'd мой хеш, как @tadman предложил, и это сработало. Интересно! – ssharma

+0

@muistooshort Это работает в Ruby 2.0+, это правда. Я действительно должен использовать это по умолчанию. – tadman

Смежные вопросы