Есть более простые способы сделать то, что вы ищете. Так как вы сделали попытку, прежде чем просить о помощи, я сломаю это для вас.
В частности, map
- это самый простой способ пройти через массив и преобразовать его значения во что-то еще. Прежде чем я объясню, как это сделать, у вас есть пара других проблем.
Во-первых, если вы ищете заглавные буквы в хеш-коде, вам нужно, чтобы ваш ввод был заглавным. Итак:
puts "Enter a phrase to translate:"
phrase = gets.chomp.upcase
Теперь chars
проще, чем использовать split('')
, и делает то же самое:
arr = phrase.chars
Далее, вы можете использовать map
для изменения массива:
new_arr = arr.map do |c|
converter[c]
end
Это будет проходить по вашему массиву один за другим, устанавливая c
равным каждому значению элемента массива (другими словами, каждому символу) по очереди. Затем результат того, что находится внутри вашего цикла do
, подключается к массиву. Когда map
достигает последнего элемента в отображаемом массиве, он возвращает новый массив, в который он вставляет значения.
Итак, c
становится вашим хеш-ключом, а converter[c]
являетсяхэш-значение для этого ключа. Это хэш-значение - это значение, которое вставляется в ваш новый массив. Результатом вызова map
будет ваша зашифрованная строка в виде массива.
Наконец, объедините результат вызова map
в строку:
new_phrase = new_arr.join
Теперь,вам не нужны все эти строки кода и дополнительные переменные, чтобы получить этот результат - я сделал это, чтобы помочь вам взглянуть на проблему по шагам за раз. После того, как вы использовали gets
для получения переменной phrase
, вы можете легко вытащить оставшуюся часть кода в одну строку:
new_phrase = phrase.chars.map { |c| converter[c] }.join
И вот она у вас.