我正在查看 Rust 参考书,它指出元组结构“当其子模式之一可反驳时,它是可反驳的”。它还指出,当“未指定子模式”时,标识符模式是无可辩驳的。
鉴于此,如果我使用单个不可反驳的标识符子模式创建一个元组结构模式,我希望元组结构模式也是不可反驳的,因为它的子模式都是不可反驳的。
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);
}
Run Code Online (Sandbox Code Playgroud)
上面代码的 AST 确认 是Foo::Bar(x)一个元组结构模式并且x是一个标识符模式。我觉得编译器在这里是正确的,但参考书表明Foo::Bar(x)尽管编译器是无可辩驳的。
我理解考虑到多种可能的枚举变体需要阻止可反驳的模式,以及 anif let或 like 在这里有何帮助,但对相互矛盾的引号感到困惑。
这是我遗漏的事情,还是参考书的问题?
各种文档,例如类型参考,没有详细讨论类型和生命周期之间的关系。这让我想知道生命周期是否是类型本身的一部分,或者它们是否只是在单态化发生之前被删除的编译器提示。
给出以下示例:
fn example<'a, 'b>(a: &'a str, b: &'b str) {
struct Foo<T> {
t: T,
}
let bar = Foo { t: a };
let baz = Foo { t: b };
}
Run Code Online (Sandbox Code Playgroud)
和bar两者baz都是同一类型,但生命周期被擦除(即Foo<&str>)并共享一个单态副本,或者它们是两种不同的类型Foo<&'a str>,并且Foo<&'b str>生命周期是该类型的一部分?
作为旁注:类型推断算法是否在任何地方记录了T在每种情况下如何接收其最终类型?