我想比较一个从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)