Итак, я работаю над реализацией Atbash Cipher для Rust - это упражнение на exercism.io. Я пришел из небольшого опыта C и обнаружил, что мой код довольно округлый и мучительный. Манипулирование str и String в Rust - это то, чего я пока не понял. Похоже, что это заняло бы меньше строк кода на языке C.
Ниже приведен мой код - правильно ли я делаю это для Rust, или я упускаю какую-то важную концепцию или способ сведения данных? ? Это так просто, как должно быть?
Упражнение включает получение ввода &str
и вывод String
, при этом каждый символ изменяется согласно шифру atbash, добавляя пробел каждые 5 символов. Включена также функция decode
. Это все идет в lib.rs
.
// "Encipher" with the Atbash cipher.
pub fn encode(plain: &str) -> String {
let mut coded: String = plain.to_string();
coded.retain(|c| c.is_ascii_alphanumeric());
coded.make_ascii_lowercase();
let coded_no_spacing = String::from_utf8(
coded
.bytes()
.map(|c| {
if c.is_ascii_alphabetic() {
122 - c + 97
} else {
c
}
})
.collect(),
)
.unwrap();
spacer(coded_no_spacing)
}
/// "Decipher" with the Atbash cipher.
pub fn decode(cipher: &str) -> String {
let mut out = encode(cipher);
out.retain(|c| c.is_ascii_alphanumeric());
out
}
fn spacer(coded_no_spacing: String) -> String {
let mut coded_no_spacing = coded_no_spacing.chars();
let mut temp_char = coded_no_spacing.next();
let mut counter = 0;
let mut coded_with_spaces = "".to_string();
while temp_char.is_some() {
if counter % 5 == 0 && counter != 0 {
coded_with_spaces.push(' ');
}
coded_with_spaces.push(temp_char.unwrap());
temp_char = coded_no_spacing.next();
counter += 1;
}
coded_with_spaces
}