为什么在 main 中使用 Result 时,match 臂中需要 return ?

发布于 2025-01-15 11:40:27 字数 681 浏览 1 评论 0原文

我正在阅读《Rust by Examples》一书。在此示例 删除 Err(e) => 中的 return return Err(e) 导致错误:预期为“i32”,但发现枚举“Result”。这是为什么?

Err(e) => 和有什么区别?返回 Err(e)Err(e) =>错误(e)?

这是示例中的代码:

use std::num::ParseIntError;

fn main() -> Result<(), ParseIntError> {
    let number_str = "10";
    let number = match number_str.parse::<i32>() {
        Ok(number)  => number,
        Err(e) => return Err(e),
    };
    println!("{}", number);
    Ok(())
}

I am reading Rust by Example book. In this example removing return in Err(e) => return Err(e) causes an error: expected `i32`, found enum `Result``. Why is that?

What is the difference between Err(e) => return Err(e) and Err(e) => Err(e)?

Here is the code from the example:

use std::num::ParseIntError;

fn main() -> Result<(), ParseIntError> {
    let number_str = "10";
    let number = match number_str.parse::<i32>() {
        Ok(number)  => number,
        Err(e) => return Err(e),
    };
    println!("{}", number);
    Ok(())
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

懒的傷心 2025-01-22 11:40:27
    let number = match number_str.parse::<i32>() {
        Ok(number)  => number,
        Err(e) => return Err(e),
    };

这表示如果 number_str.parse::() 返回 Oknumber 设置为 number ,i32。如果它返回 Err,则立即从 main 返回 Err(e),这是一个 Result,<代码>数字未设置。

这很好,因为 number 只能是 i32 并且 main 确实返回 Result

    let number = match number_str.parse::<i32>() {
        Ok(number)  => number,
        Err(e) => Err(e),
    };

这表示如果 number_str.parse::() 返回 Oknumber 设置为 number ,i32,和以前一样。如果它返回一个Err,则将number设置为Err(e),这是一个Result

number 不能同时是 i32Result,因此您会收到编译器错误。

    let number = match number_str.parse::<i32>() {
        Ok(number)  => number,
        Err(e) => return Err(e),
    };

This says if number_str.parse::<i32>() returns an Ok to set number to number, an i32. If it returns an Err to immediately return Err(e), which is a Result, from main, number is not set.

That's fine because number can only be an i32 and main does return a Result.

    let number = match number_str.parse::<i32>() {
        Ok(number)  => number,
        Err(e) => Err(e),
    };

This says if number_str.parse::<i32>() returns an Ok to set number to number, an i32, same as before. If it returns an Err to set number to Err(e), which is a Result.

number cannot be both an i32 and a Result, so you get a compiler error.

与他有关 2025-01-22 11:40:27

比赛的所有手臂都必须具有“兼容”类型。这要么意味着它们都具有相同的类型:

fn is_some<T>(opt: &Option<T>) -> bool {
  match opt {
    // both arms have type bool
    Some(_) => true,
    None => false,
  }
}

要么某些分支需要以某种方式将控制流从匹配中引出。

要记住的主要规则是 Rust 中的每个变量都需要一个单一类型(忽略生命周期的差异)。就您而言,如果没有 return 关键字,number 的类型是什么?

如果解析成功,number 将是 i32。如果失败,则会出现 Err(ParseIntError)。这是不允许的,因此您会收到编译错误。

但是,如果您返回 Err(e),则 number 将始终为 i32(因为 return 会阻止其余部分)运行的函数,因此 number 不需要类型)。

类似的事情也适用于其他控制流关键字(例如 continuebreak 等),以及保证不返回的内容,例如 panic!() (查找 Never/! 类型以获取更多信息)

All arms of a match have to have "compatible" types. This either mean they all have the same type:

fn is_some<T>(opt: &Option<T>) -> bool {
  match opt {
    // both arms have type bool
    Some(_) => true,
    None => false,
  }
}

or some of the branches need to direct control flow away from the match in some way.

The main rule to keep in your head is that every variable in Rust needs a single type (ignoring variance w.r.t. lifetimes). In your case, if you didn't have the return keyword, what would be the type of number?

If the parse succeeds, number would be an i32. If it fails, it would be an Err(ParseIntError). This isn't allowed, so you get a compile error.

However, if you return Err(e), number will always be an i32 (since return prevents the rest of the function running, so number doesn't need a type).

A similar thing applies to other control-flow keywords (e.g. continue, break, ...), as well as things that are guaranteed to not return, like panic!() (look up the Never/! type for more info)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文