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

Rust中使用match时遇String与&str类型不匹配错误的解决咨询

Rust Match语句类型不匹配问题解决

问题错误信息

"add" => {    |         ^^^^^ expected struct `String`, found `&str`
match input_string {    |           ------------ this expression has type `String` 22 |         "add" => {    |         ^^^^^ expected struct `String`, found `&str`

用户代码

use std::io;

fn add(x1: i32, x2: i32) -> i32 {
    return x1 + x2;
}
fn subtract(x1: i32, x2: i32) -> i32 {
    return x1 - x2;
}
fn multiply(x1: i32, x2: i32) -> i32 {
    return x1 * x2;
}
fn divide(x1: i32, x2: i32) -> i32 {
    return x1 / x2;
}

fn main() {
    let mut input_string = String::new();
    println!("Enter either add, substract, multiply, or divide:");
    io::stdin().read_line(&mut input_string).unwrap();

    match input_string {
        "add" => {
            let mut input_number = String::new();

            io::stdin()
                .read_line(&mut input_number)
                .expect("Not a valid string");

            println!("Number 1 {}", input_number);
            let mut input_number2 = String::new();
            io::stdin()
                .read_line(&mut input_number2)
                .expect("Not a valid string");

            println!("Number 2 {}", input_number2);

            let parsedNumb1: i32 = input_number.trim().parse().unwrap();
            let parsedNumb2: i32 = input_number2.trim().parse().unwrap();
            add(parsedNumb1, parsedNumb2);
        }
    }
}

解决方案

核心问题

input_string是拥有所有权的String类型,而match分支里的"add"是字符串切片&str类型,Rust不允许不同类型直接匹配。此外,read_line会读取用户输入的换行符,导致input_string实际内容是"add\n",即使类型匹配也无法和"add"匹配,所以需要先处理换行符。

推荐解决方法

先对输入字符串做trim()处理去掉首尾空白(包括换行),再转为&str类型进行match:

use std::io;

fn add(x1: i32, x2: i32) -> i32 {
    x1 + x2
}
fn subtract(x1: i32, x2: i32) -> i32 {
    x1 - x2
}
fn multiply(x1: i32, x2: i32) -> i32 {
    x1 * x2
}
fn divide(x1: i32, x2: i32) -> i32 {
    x1 / x2
}

fn main() {
    let mut input_string = String::new();
    println!("Enter either add, subtract, multiply, or divide:");
    io::stdin().read_line(&mut input_string).unwrap();
    
    // 处理输入:去掉换行和空白,转为字符串切片
    let command = input_string.trim().as_str();

    match command {
        "add" => {
            let mut input_number = String::new();
            println!("Enter first number:");
            io::stdin()
                .read_line(&mut input_number)
                .expect("Failed to read input");

            let mut input_number2 = String::new();
            println!("Enter second number:");
            io::stdin()
                .read_line(&mut input_number2)
                .expect("Failed to read input");

            let parsedNumb1: i32 = input_number.trim().parse().unwrap();
            let parsedNumb2: i32 = input_number2.trim().parse().unwrap();
            println!("Result: {}", add(parsedNumb1, parsedNumb2));
        }
        "subtract" => {
            let mut input_number = String::new();
            println!("Enter first number:");
            io::stdin().read_line(&mut input_number).expect("Failed to read input");

            let mut input_number2 = String::new();
            println!("Enter second number:");
            io::stdin().read_line(&mut input_number2).expect("Failed to read input");

            let parsedNumb1: i32 = input_number.trim().parse().unwrap();
            let parsedNumb2: i32 = input_number2.trim().parse().unwrap();
            println!("Result: {}", subtract(parsedNumb1, parsedNumb2));
        }
        "multiply" => {
            let mut input_number = String::new();
            println!("Enter first number:");
            io::stdin().read_line(&mut input_number).expect("Failed to read input");

            let mut input_number2 = String::new();
            println!("Enter second number:");
            io::stdin().read_line(&mut input_number2).expect("Failed to read input");

            let parsedNumb1: i32 = input_number.trim().parse().unwrap();
            let parsedNumb2: i32 = input_number2.trim().parse().unwrap();
            println!("Result: {}", multiply(parsedNumb1, parsedNumb2));
        }
        "divide" => {
            let mut input_number = String::new();
            println!("Enter first number:");
            io::stdin().read_line(&mut input_number).expect("Failed to read input");

            let mut input_number2 = String::new();
            println!("Enter second number:");
            io::stdin().read_line(&mut input_number2).expect("Failed to read input");

            let parsedNumb1: i32 = input_number.trim().parse().unwrap();
            let parsedNumb2: i32 = input_number2.trim().parse().unwrap();
            
            if parsedNumb2 == 0 {
                println!("Error: Cannot divide by zero");
            } else {
                println!("Result: {}", divide(parsedNumb1, parsedNumb2));
            }
        }
        _ => println!("Invalid command. Please enter add, subtract, multiply, or divide."),
    }
}

额外优化点

  • 去掉函数里多余的return,Rust函数默认返回最后一行表达式结果
  • 补充其他指令的处理分支和默认分支,避免程序panic
  • 增加除数为0的判断,防止运行时错误
  • 优化输入提示,让用户更清楚下一步操作

内容的提问来源于stack exchange,提问作者BARNOWL

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 03:16:17