Recebo o erro abaixo ao adicionar uma segunda condição de correspondência
match
armas têm tipos incompatíveis|_____-
match
os braços têm tipos incompatíveis
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}"),
}
}
Não tenho certeza se estou pegando emprestado corretamente, mas parece que é um problema de empréstimo. Como poderia ser flexível para outras condições como multiplicar, dividir e subtrair.
match
, em Rust, é uma expressão como1 + 1
oucalc()
. Na verdade, a maioria das coisas em Rust são expressões, e isso significa que elas retornam um valor. No caso dematch
, todos os seus braços devem retornar um valor do mesmo tipo.Em seu código atual, a
"add"
ramificação retornariai32
(o resultado decalc
), mas você suprime isso com um ponto e vírgula para obter , pronunciado "()
unidade" A terceira ramificação retorna o resultado deprintln!
, que também é()
.O segundo braço retorna o resultado emprestado de
calc
, so&i32
. O que não é compatível com()
.Como você não faz nada com esse resultado, presumo que você pretendia imprimir em cada caso. Então algo como
Vamos olhar apenas para os braços do fósforo e ver qual deles tem o
O ponto e vírgula resulta neste braço retornando o tipo de unidade
()
.Este braço retorna uma referência ao resultado do cálculo,
&i32
.println!
retorna o tipo de unidade também, então este braço retorna o tipo de unidade()
.Então você tem dois braços que resultam em
()
, e um braço que não resulta. Para corrigir isso, você tem duas opções:()
adicionando um ponto e vírgula após o segundocalc
:i32
e o último braço divergir entrando em pânico em vez de apenas imprimir: