AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 76925968
Accepted
BARNOWL
BARNOWL
Asked: 2023-08-18 09:39:40 +0800 CST2023-08-18 09:39:40 +0800 CST 2023-08-18 09:39:40 +0800 CST

在匹配内重用函数时,匹配臂具有预期的不兼容类型

  • 772

添加第二个匹配条件时出现以下错误

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}"),
    }
}

我不确定我借的是否正确,但这似乎是借的问题。它如何能够灵活地处理其他条件,例如乘法、除法和减法。

铁锈游乐场

rust
  • 2 2 个回答
  • 25 Views

2 个回答

  • Voted
  1. Silvio Mayolo
    2023-08-18T10:10:31+08:002023-08-18T10:10:31+08:00

    match在 Rust 中,是一个类似于1 + 1or 的表达式calc()。事实上,Rust 中的大多数内容都是表达式,这意味着它们返回一个值。在 的情况下match,其所有臂必须返回相同类型的值。

    match input_string.as_str().trim() {
      "add" => {
        calc(add);
      }
      "subtract" => &calc(subtract), // error here 
      c => println!("Invalid command: {c}"),
    }
    

    在您当前的代码中,该"add"分支将返回i32( 的结果calc),但您可以使用分号来抑制它以获得(),发音为“unit” 第三个分支返回 的结果println!,这也是()。

    第二个分支返回 的借用结果calc,因此&i32。哪个不兼容()。

    由于您没有对这个结果执行任何操作,因此我假设您打算在每种情况下进行打印。所以像

    match input_string.as_str().trim() {
      "add" => {
        println!("{}", calc(add));
      }
      "subtract" => {
        println!("{}", calc(subtract));
      }
      c => {
        println!("Invalid command: {c}");
      }
    }
    
    • 1
  2. Best Answer
    PitaJ
    2023-08-18T10:11:05+08:002023-08-18T10:11:05+08:00

    让我们只看比赛的手臂,看看哪一个有

    "add" => {
        calc(add);
    }
    

    分号导致该臂返回单位类型()。

    "subtract" => &calc(subtract), // error here 
    

    该手臂返回对计算结果的引用&i32。

    c => println!("Invalid command: {c}"),
    

    println!也返回单位类型,因此该手臂返回单位类型()。

    所以你有两只手臂会导致(),而一只手臂则不会。要纠正这个问题,您有两种选择:

    1. ()通过在第二个之后添加分号来使所有手臂返回calc:
        match input_string.as_str().trim() {
            "add" => {
                calc(add);
            }
            "subtract" => {
                calc(subtract);
            }
            c => println!("Invalid command: {c}"),
        }
    
    1. i32通过恐慌而不是仅仅打印来使前两个手臂返回并且最后一个手臂发散:
        match input_string.as_str().trim() {
            "add" => calc(add),
            "subtract" => calc(subtract), 
            c => panic!("Invalid command: {c}"),
        }
    
    • 1

相关问题

  • match 语句中的 Rust 类型转换

  • 如何强制匹配的返回类型为()?

  • 原始表示中的 Rust 枚举

  • 有没有办法直接简化 Result<String, VarError> 中 Ok("VAL") 的匹配

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve