gpt4 book ai didi

rust - 在 Rust 中比较字符串

转载 作者:行者123 更新时间:2023-11-29 07:44:06 29 4
gpt4 key购买 nike

我想比较来自 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);
}
}

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

非常感谢您的帮助。

最佳答案

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

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

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

第四,最快的方式是从String&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");
}
}

关于rust - 在 Rust 中比较字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27201086/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com