Как я могу реструктурировать этот код, чтобы '.each' не предоставлял замороженные переменные?
Краткий ответ: вы не можете.
Hash#each
не "предоставляет замороженные переменные".
Во-первых, не существует такой вещи, как "замороженная переменная". Переменные не заморожены. Объекты есть. Различие между переменными и объектами является фундаментальным , не только в Ruby, но и в любом языке программирования (и на самом деле в значительной степени везде, также). Если у меня есть наклейка с именем «Симус», то эта наклейка - не вы. Это просто ярлык, который относится к вам.
Во-вторых, Hash#each
не предоставляет «переменных». Фактически, он не предоставляет ничего, чего уже нет в хэше. Он просто возвращает объекты, которые уже находятся в хэше.
Обратите внимание, что во избежание путаницы и ошибок строки автоматически замораживаются при использовании в качестве ключей. Таким образом, вы не можете изменять строковые ключи. Вы можете либо убедиться, что они верны с самого начала, либо создать новый хеш с новыми строковыми ключами. (Вы также можете добавить новые ключи к существующему хешу и удалить старые ключи, но это очень сложно для небольшого выигрыша.)