Rust中如何正确比较静态不可变字符串与可变字符串?
Rust中String与&str比较失败的解决办法
你的问题出在read_line方法的行为上——它会把用户输入时按下的**换行符(\n)**也一并读取到字符串里。也就是说,当你输入"exit"并回车后,input_line实际存储的是"exit\n"(Windows下是"exit\r\n"),和你用来比较的"exit"自然不相等。
解决方法很简单,在比较前先去掉字符串末尾的换行符和空白字符,常用的方式有两种:
- 使用
trim():去掉字符串首尾所有空白字符(包括换行、空格、制表符等) - 使用
trim_end_matches(&['\n', '\r'][..]):精准去掉末尾的换行符(只针对换行场景更严谨)
修改后的核心代码示例:
use std::io::{self, BufRead}; fn main() { let mut input_line = String::new(); let stdin = io::stdin(); let mut input_handler = stdin.lock(); let exit_str = "exit"; // 直接用&str更高效,没必要转String loop { input_line.clear(); // 用clear()替代重新创建String,性能更好 if input_handler.read_line(&mut input_line).is_err() { eprintln!("读取输入失败"); break; } // 去掉末尾的换行符 let trimmed_input = input_line.trim(); print!("surrealdbcli:"); println!("Your Input={}", input_line); println!("Is your input \"exit\"? {}", trimmed_input == exit_str); if trimmed_input == exit_str { break; // 匹配成功,退出循环 } } }
额外优化点:
- 直接用
"exit"这种静态&str进行比较,无需转换为String,更高效 - 使用
input_line.clear()替代每次创建新的String,减少内存分配 - 增加了输入错误的简单处理
内容的提问来源于stack exchange,提问作者Snehangshu Bhusan Pal
相关产品推荐
相关产品推荐

