You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 06:10:07