小编Lou*_*inn的帖子

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

我正在查看 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 在这里有何帮助,但对相互矛盾的引号感到困惑。

这是我遗漏的事情,还是参考书的问题?

language-lawyer rust

3
推荐指数
1
解决办法
382
查看次数

生命周期是类型的一部分吗?

各种文档,例如类型参考,没有详细讨论类型和生命周期之间的关系。这让我想知道生命周期是否是类型本身的一部分,或者它们是否只是在单态化发生之前被删除的编译器提示。

给出以下示例:

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在每种情况下如何接收其最终类型?

types language-lawyer rust

2
推荐指数
1
解决办法
419
查看次数

标签 统计

language-lawyer ×2

rust ×2

types ×1