我想比较一下stdin输入的字符串和静态字符串,但没有运气.

以下是我迄今为止try 过的:

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中的静态字符串进行比较?

非常感谢你的帮助.

推荐答案

首先,行包含行终止符.您可能希望使用trim(或其变体之一)来忽略这一点.

其次,你做了很多不必要的转换和分配.尽量避免这些.

第三,由于过度分配,to_string(或者至少是我上次判断时的was)效率低下.你想要into_string.

第四,从String&str的最快方式是"交叉borrow ";给定一个Strings&*s将以&str的形式重新borrow 它.这是因为String代表Deref<&str>;换句话说,String就像一个指向借来的字符串的智能指针,允许它衰减为更简单的形式.

除非你用第五个循环,或者用第五个循环重写.

第六,请注意,stdin()实际上会在每次调用它时分配一个新的缓冲读取器.不仅如此,当创建新的缓冲区时,读入缓冲区do not的字符会被"推回"到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");
    }
}

Rust相关问答推荐

使用windows crate Rust 展示windows

预期 struct VecDeque Student发现 struct VecDeque Student(Student)

如何处理对打包字段的引用是未对齐错误?

有没有方法处理rust中嵌套的ok_or()?

为什么拥有的trait对象的相等运算符移动了正确的操作数?

有没有办法在Rust中配置常量变量的值?

防止cargo test 中的竞争条件

从Type::new()调用函数

为什么基于高山Linux的Docker镜像不能在绝对路径下找到要执行的命令?

获取已知数量的输入

我应该如何表达具有生命周期参数的类型的总排序,同时允许与不同生命周期进行比较?

如何重命名 clap_derive 中的子命令占位符?

如何将一个矩阵的列分配给另一个矩阵,纳尔代数?

如何使用tracing-subscriberRust crate 构建多编写者、全局过滤订阅者

Rust 中指向自身的引用如何工作?

Rust并发读写引起的死锁问题

为什么 `tokio::join!` 宏不需要 Rust 中的 `await` 关键字?

如何连接 Rust 中的相邻切片

更好的方法来模式匹配带有 Rust 的窥视孔装配说明窗口?

判断 is_ok 后重用结果