为什么Rust push new line into String而push可选字符?



我正在尝试从Rust编程语言第8章末尾开始的练习,将单词翻译成猪拉丁文。不幸的是,我有一个问题,我的算法插入一个新的行结束之前。

例如,单词"rust"翻译如下:

$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
Running `target/debug/pig_latin`
Please type a word.
rust
ust
ray
我的代码如下:
use std::io;
fn main() {
println!("Please type a word.");
let mut word = String::new();

io::stdin()
.read_line(&mut word)
.expect("Failed to read line");
let mut translation = String::new();
let mut first_letter: Option<char> = None;
let mut first_run = true;
for c in word.chars() {
if first_run {
first_run = false;
match c {
'a' => translation.push('a'),
'e' => translation.push('e'),
'i' => translation.push('i'),
'o' => translation.push('o'),
'u' => translation.push('u'),
_ => first_letter = Some(c),
}
} else {
translation.push(c);
}
}
if let Some(letter) = first_letter {
translation.push(letter);
translation.push_str("ay");
} else {
translation.push_str("ay");
}
println!("{}", translation);
}

我做错了什么?

正如@eggyal在评论中指出的那样,"read_line()在输入word的末尾包含换行符。"因此,我的for循环不会在没有将换行符推入translation之前结束。为了解决这个问题,我只是循环了我的word减去最后一个字符的切片,它工作了。

我的新代码如下:
use std::io;
fn main() {
println!("Please type a word.");
let mut word = String::new();

io::stdin()
.read_line(&mut word)
.expect("Failed to read line");
let mut translation = String::new();
let mut first_letter: Option<char> = None;
let mut first_run = true;
// for c in word[..word.len() - 1].chars() {
for c in word.trim().chars() { // suggested by @Cerberus
if first_run {
first_run = false;
match c {
'a' => translation.push('a'),
'e' => translation.push('e'),
'i' => translation.push('i'),
'o' => translation.push('o'),
'u' => translation.push('u'),
_ => first_letter = Some(c),
}
} else {
translation.push(c);
}
}
if let Some(letter) = first_letter {
translation.push('-');
translation.push(letter);
translation.push_str("ay");
} else {
translation.push('-');
translation.push_str("hay");
}
println!("{}", translation);
}

最新更新