我写了一个函数来提示输入并返回结果。 在这个版本中,返回的字符串包括用户输入的尾随换行符。 我想返回已删除该换行符(仅该换行符)的输入:
我编写了一段提示输入并返回结果的函数。 在这个版本中,返回的字符串包含用户输入中的换行符。 我希望返回已经删除该换行符(仅限该换行符)的输入内容:
fn read_with_prompt(prompt: &str) -> io::Result<String> {
let stdout = io::stdout();
let reader = io::stdin();
let mut input = String::new();
print!("{}", prompt);
stdout.lock().flush().unwrap();
reader.read_line(&mut input)?;
// TODO: Remove trailing newline if present
Ok(input)
}
仅删除单个尾随换行符的原因是,该函数也将用于提示输入密码(使用termios适当地停止回显),如果某人的密码有尾随空格,则应保留。
在烦恼如何实际上删除字符串末尾的单个换行符时,我最终使用了trim_right_matches
。但是它返回一个&str
。我试图使用Cow
来解决这个问题,但错误仍然显示input
变量的寿命不够长。
fn read_with_prompt<'a>(prompt: &str) -> io::Result<Cow<'a, str>> {
let stdout = io::stdout();
let reader = io::stdin();
let mut input = String::new();
print!("{}", prompt);
stdout.lock().flush().unwrap();
reader.read_line(&mut input)?;
let mut trimmed = false;
Ok(Cow::Borrowed(input.trim_right_matches(|c| {
if !trimmed && c == '\n' {
trimmed = true;
true
}
else {
false
}
})))
}
错误:
error[E0515]: cannot return value referencing local variable `input`
--> src/lib.rs:13:5
|
13 | Ok(Cow::Borrowed(input.trim_right_matches(|c| {
| ^ ----- `input` is borrowed here
| _____|
| |
14 | | if !trimmed && c == '\n' {
15 | | trimmed = true;
16 | | true
... |
20 | | }
21 | | })))
| |________^ returns a value referencing data owned by the current function
根据之前类似的问题,似乎这是不可能的。唯一的选择是分配一个新字符串,删除尾随换行符吗?似乎应该有一种在不复制字符串的情况下修剪字符串的方法(在C语言中,您只需用'\0'
替换'\n'
)。