gpt4 book ai didi

rust - `return` 语句不应该返回 `!`(从不输入)吗?

转载 作者:行者123 更新时间:2023-12-01 23:07:53 24 4
gpt4 key购买 nike

示例代码片段:

fn foo() -> i32 {
let a = return 2;
a + 1
}
fn main() {
println!("{}", foo());
}

我希望因为 a 实际上永远不会被分配任何东西,所以它的类型应该是 !。但是编译器告诉我它的类型实际上是 () (单位类型)。这让我觉得很奇怪。这背后的原因可能是什么?

最佳答案

return 42的类型!:

break, continue and return expressions also have type !. For example we are allowed to write:

#![feature(never_type)]
let x: ! = {
return 123
};

来自 https://doc.rust-lang.org/std/primitive.never.html .

但是 ! 的特性之一是它可以强制转换为任何类型的值:

fn foo() -> i32 {
let a: String = return 2;
42
}

fn main() {
println!("{}", foo());
}

这就是使之成为可能的原因

let num: u32 = match get_a_number() {
Some(num) => num,
None => break,
};

(来自同一页面)。

两个分支必须具有相同的类型。 num显然是u32break!。然后,通过将 break 强制转换为 u32,两者可以具有相同的类型 u32

这非常好,因为 ! 类型的值永远不会存在,因此编译器可以将其“转换”为任何其他类型的任何值。

在您的示例中出现混淆的地方是编译器将声明“错误 [E0277]:无法将 i32 添加到 ()”。这大概是历史原因吧。 ! 在 Rust 1.0 时代并没有这样存在。随着时间的推移,它变得更像是一等公民,但一些特殊情况需要向后兼容,其中 ! 将被视为 () 而不是任何其他类型。

关于rust - `return` 语句不应该返回 `!`(从不输入)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70481478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com