Я бы пошел дальше и расширил ваш хеш до всех 26 букв, чтобы вы могли избежать обратного поиска. Это упростит ваш код, удалив один случай, что может убить Rubocop ... Но что более важно, вы будете использовать хеш-индекс для большей эффективности и производительности. Обратный поиск в хэше дорогой, так как он должен читать (до) каждое значение.
Рассмотрим кодировку «1 + 2». Она выполнит три быстрых сканирования индекса, а затем три полных сканирования массива, только чтобы вернуть исходную строку.
С полностью заполненным хешем потребуется всего три быстрых сканирования.
Вот ваш оригинальный код с минимальными изменениями для достижения вашей цели: (Есть более короткие способы сделать это (подсказка: tr
или map
), но более короткий не так важен, как простой и удобный для программиста использование код.)
translation = {
'a' => 'z', 'b' => 'y', 'c' => 'x', 'd' => 'w', 'e' => 'v', 'f' => 'u', 'g' => 't',
'h' => 's', 'i' => 'r', 'j' => 'q', 'k' => 'p', 'l' => 'o', 'm' => 'n', 'n' => 'm',
'o' => 'l', 'p' => 'k', 'q' => 'j', 'r' => 'i', 's' => 'h', 't' => 'g', 'u' => 'f',
'v' => 'e', 'w' => 'd', 'x' => 'c', 'y' => 'b', 'z' => 'a'
}.freeze
def encoder(str)
encoded_string = ''
str.chars.each do |char|
encoded_string << translation[char] || char
end
encoded_string
end
Вы можете даже рассмотреть вопрос о расширении хеша до прописных и строчных букв или даже до всех 256-значных значений, в зависимости от решаемой проблемы. Но давайте согласимся игнорировать символы Unicode!
Назад к Rubocop ... Самое простое, надежное решение для любого вида «слишком длинных / слишком сложных» предупреждений - вытащить код для нового метода. Напишите def charswap
и используйте это как тело вашего цикла. Это облегчит написание тестов для загрузки. Но, расширив массив перевода до всех 26 букв, код становится настолько простым, что рефакторинг на самом деле не нужен.