从io :: stdin()。read_line()修剪'\ n'的更好方法是什么?

时间:2019-01-28 03:35:40

标签: string rust newline

下面的代码对我来说很好。

let mut buffer = String::new();
io::stdin().read_line(&mut buffer);
buffer = buffer.trim().to_string();

'\n'修剪read_line的更好/正确的方法是什么?

1 个答案:

答案 0 :(得分:2)

我只看到一个可以在您的代码中进行改进的方面:您分配了两个字符串以读取一行的事实。第一次分配发生在将行读入buffer时,第二次分配发生在to_string()中。

根据上下文,有几种方法可以避免这种情况。最简单的方法是避免调用to_string,而继续使用&str而不是String。如果这对您不起作用,您还可以编写自己的函数以在字符串末尾修剪换行符:

fn trim_newline(s: &mut String) {
    if s.ends_with('\n') {
        s.pop();
        if s.ends_with('\r') {
            s.pop();
        }
    }
}

这不等同于原始代码中的trim(),因为它仅从字符串末尾删除换行符,而不是从字符串末尾删除任意空格。

另一种选择是使用lines()迭代器,该迭代器从stdin生成行而不会终止换行符:

use std::io::{BufRead};
let stdin = std::io::stdin();
for line in stdin.lock().lines() {
    let line = line?;   // line is a Result<String, io::Error>
}