添加第二个匹配条件时出现以下错误
match
手臂有不兼容的类型|_____-
match
手臂具有不兼容的类型
use std::io;
fn add(x1: i32, x2: i32) -> i32 {
let total = x1 + x2;
println!("Total is: {}", total);
return total;
}
fn subtract(x1: i32, x2: i32) -> i32 {
let total = x1 - x2;
println!("Total is: {}", total);
return total;
}
fn multiply(x1: i32, x2: i32) -> i32 {
let total = x1 * x2;
println!("Total is: {}", total);
return total
}
fn divide(x1: i32, x2: i32) -> i32 {
let total = x1 / x2;
println!("Total is: {}", total);
return total
}
fn calc(operation: fn(num1: i32, num2: i32) -> i32) -> i32 {
let mut input_number = String::new();
println!("Enter Number:");
io::stdin()
.read_line(&mut input_number)
.expect("Not a valid string");
println!("Enter another number:");
let mut input_number2 = String::new();
io::stdin()
.read_line(&mut input_number2)
.expect("Not a valid string");
let parsed_numb1: i32 = input_number.trim().parse().unwrap();
let parsed_numb2: i32 = input_number2.trim().parse().unwrap();
return operation(parsed_numb1, parsed_numb2);
}
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.as_str().trim() {
"add" => {
calc(add);
}
"subtract" => &calc(subtract), // error here
c => println!("Invalid command: {c}"),
}
}
我不确定我借的是否正确,但这似乎是借的问题。它如何能够灵活地处理其他条件,例如乘法、除法和减法。
match
在 Rust 中,是一个类似于1 + 1
or 的表达式calc()
。事实上,Rust 中的大多数内容都是表达式,这意味着它们返回一个值。在 的情况下match
,其所有臂必须返回相同类型的值。在您当前的代码中,该
"add"
分支将返回i32
( 的结果calc
),但您可以使用分号来抑制它以获得()
,发音为“unit” 第三个分支返回 的结果println!
,这也是()
。第二个分支返回 的借用结果
calc
,因此&i32
。哪个不兼容()
。由于您没有对这个结果执行任何操作,因此我假设您打算在每种情况下进行打印。所以像
让我们只看比赛的手臂,看看哪一个有
分号导致该臂返回单位类型
()
。该手臂返回对计算结果的引用
&i32
。println!
也返回单位类型,因此该手臂返回单位类型()
。所以你有两只手臂会导致
()
,而一只手臂则不会。要纠正这个问题,您有两种选择:()
通过在第二个之后添加分号来使所有手臂返回calc
:i32
通过恐慌而不是仅仅打印来使前两个手臂返回并且最后一个手臂发散: