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
相关产品推荐
相关产品推荐

