【问题标题】:Comparing string in Rust比较 Rust 中的字符串
【发布时间】:2014-11-29 18:24:25
【问题描述】:

我想比较一个来自标准输入的字符串输入和一个静态字符串,但没有运气。

这是我迄今为止尝试过的:

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);
    }   
}

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

非常感谢您的帮助。

【问题讨论】:

    标签: rust


    【解决方案1】:

    首先,该行包含行终止符。您可能想使用trim(或其变体之一)来忽略它。

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

    第三,由于过度分配,to_string (或者至少,我上次检查时 )效率低下。你想要into_string

    第四,从String&str 的最快方法是“交叉借用”它;给定一个Strings&*s 将重新借用它作为&str。这是因为String 实现了Deref<&str>;换句话说,String 的行为有点类似于指向借用字符串的智能指针,允许它衰减为更简单的形式。

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

    第六,请注意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");
        }
    }
    

    【讨论】:

    • 谢谢。我没有意识到来自 STDIN 的输入字符串包含换行符。
    猜你喜欢
    • 2022-11-15
    • 2019-12-22
    • 2014-12-08
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 2013-03-21
    相关资源
    最近更新 更多