gpt4 book ai didi

rust - 为什么编译器认为这种元组结构模式是可反驳的?

转载 作者:行者123 更新时间:2023-12-05 00:42:30 25 4
gpt4 key购买 nike

我在看 Rust 引用书,它指出元组结构是“refutable when one of its subpatterns is refutable”。它还指出,当“the subpattern is not specified”时,标识符模式是无可辩驳的。

鉴于此,如果我创建一个具有单个不可辩驳的标识符子模式的元组结构模式,我希望元组结构模式也是无可辩驳的,因为它的子模式都是无可辩驳的。

pub fn main() {
enum Foo {
Bar(i32),
Baz(i32),
}

// Compiler says Foo::Bar(x) is a refutable pattern
// but the reference book suggests it is irrefutable
let Foo::Bar(x) = Foo::Bar(50);
}

上面代码的 AST 确认 Foo::Bar(x) 是一个元组结构模式,而 x 是一个标识符模式。我觉得这里的编译器是正确的,但是引用书表明 Foo::Bar(x) 尽管编译器是无可辩驳的。

我了解在考虑到多种可能的枚举变体以及 if let 或类似内容如何在这里提供帮助的情况下阻止可反驳模式的必要性,但我对矛盾的引号感到困惑。

这是我遗漏的事情,还是引用书的问题?

最佳答案

Foo::Bar(50) 的类型是 Foo ,就像 4 的类型一样是 i32 .

看看这个:

let 4 = 4;
error[E0005]: refutable pattern in local binding: `i32::MIN..=3_i32` and `5_i32..=i32::MAX` not covered
--> src/main.rs:2:9
|
2 | let 4 = 4;
| ^ patterns `i32::MIN..=3_i32` and `5_i32..=i32::MAX` not covered
|
= note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant
= note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html
= note: the matched value is of type `i32`

这是可以反驳的,因为 4类型右边是i32 .该值与可反驳性无关。一切都与类型有关。

还有 let 4 = <i32>是可反驳的,因为 <i32>可能是不同于 4 的值.

我认为 refutability只讨论类型,不讨论

当然,我不是理论语言专家,所以我可能完全不在话下。但这就是我对可反驳性的理解。

关于rust - 为什么编译器认为这种元组结构模式是可反驳的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73325676/

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