比较Rust中的字符串

Jos*_*ogi 9 rust

我想比较一个从stdin输入的字符串到一个没有运气的静态字符串.

这是我到目前为止所尝试的:

fn main() -> () {
    let mut line = "".to_string();
    let exit = "exit".to_string(); 

    while line.as_slice() != exit.as_slice() {
        let input = std::io::stdin().read_line().ok();

        line.push_str( input.unwrap().to_string().as_slice() );

        assert_eq!(line, exit);
    }   
}
Run Code Online (Sandbox Code Playgroud)

但是在断言期间失败了.我应该如何将字符串输入与Rust中的静态字符串进行比较?

非常感激您的帮忙.

DK.*_*DK. 20

首先,该行包含行终止符.您可能希望使用trim(或其中一个变体)忽略它.

其次,您正在进行大量不必要的转换和分配.尽量避免这些.

第三,由于过度分配,to_string是(或者至少我最后一次检查)效率低下.你想要的into_string.

第四,从a String到a 的最快捷方式&str是"交叉借用"它; 如果给出String s,&*s将重新借用它作为&str.这是因为一个String工具Deref<&str>; 换句话说,String行为那种像一个智能指针,以借来的字符串,使其衰变到一个简单的形式.

第五,除非你做了一些不寻常的事情,否则你可以for使用lines迭代器方法将其重写为循环.

第六,要注意stdin()每次调用它时实际分配一个新的缓冲读取器.不仅如此,在创建新缓冲区时,读入缓冲区的字符不会被"推回"到STDIN中; 数据丢失了.所以你真的不想在循环中调用它.如果需要,请调用一次并将结果保存在变量中.

所以,我最终得到了这个:

fn main() {
    for line in std::io::stdin().lines() {
        // Extract the line, or handle the error.
        let line = match line {
            Ok(line) => line,
            Err(err) => panic!("failed to read line: {}", err)
        };

        assert_eq!(line.trim(), "exit");
    }
}
Run Code Online (Sandbox Code Playgroud)