【问题标题】:Why use the word 'generic' in lifetime parameters?为什么在生命周期参数中使用“通用”一词?
【发布时间】:2020-12-17 23:32:36
【问题描述】:

我们写的时候:

fn foo<'a, 'b>(x: &'a u32, y: &'b u32) -> &'a u32 {
    x
}

我们为什么不直接将'as 和'bs 称为生命周期参数,而不是通用生命周期参数?这只是一种语法方式,可以根据参数的生命周期向编译器传达对返回引用的生命周期的约束。我很难找到包含“通用”一词的理由here

【问题讨论】:

    标签: generics rust reference lifetime lifetime-scoping


    【解决方案1】:

    我们在“生命周期参数”前面使用“通用”一词,因为它们是通用生命周期参数。

    明显的反例是'static,它是唯一的非匿名生命周期,因此我们可以在通用上下文之外引用它。另一方面,由于所有其他可能的生命周期都是匿名的,我们可以引用它们的唯一方法是通过通用生命周期参数。

    下面的foo 函数可以在理论上无限多个不同的可能生命周期来调用,并且它适用于所有这些情况,因为它在生命周期内是通用的。这是一个使用 2 个不同生命周期调用它的示例:

    fn foo<'a>(x: &'a i32) -> &'a i32 { x }
    
    fn main() {
        foo(&1); // called with 'static lifetime
        let x = 1;
        foo(&x); // called with x's anonymous lifetime
        // and so on
    }
    

    两次调用中输入参数和输出返回类型之间的生命周期约束关系相同,但生命周期不同。

    【讨论】:

    • 感谢您的回答,但我仍然不明白这是如何使'a generic 而不是简单地采用各种 values的参数>(其中'static)。您是说 'staticthe-lifetime-of-x 是不同的 type 吗?特别是,foo 可以用无限多的参数调用,不是因为它比x 通用,而是因为参数x 可以用无限多的参数值传递。
    • @JSStuball 'a 是通用生命周期参数,而 'static 不是通用生命周期参数。 'static 代表一个非常具体的生命周期。就像i32 不是泛型类型一样。是的,生命周期会影响类型。考虑Foo&lt;'a&gt; 类型,具有不同生命周期的Foo 实例不可互换(尽管编译器可以根据情况强制它们)。在这种情况下,它们更像是泛型类型。
    • &amp;'a i32&amp;'b i32 是否被认为是不同的类型?到目前为止,我一直认为生命周期注释是与传递给函数的参数相关的信息,而不是实际的类型信息。这种语义上的调整似乎证明了在我们讨论生命周期的任何地方都使用泛型一词是合理的。
    • @JSStuball 是的,&amp;'a i32&amp;'b i32 是不同的类型,而 'a'b 的生命周期不同。但是,很难观察到这一点,因为编译器会尝试统一生命周期以使代码编译。
    【解决方案2】:

    “Generic”让我想到了泛型类型,但据我所知,它与这里无关。

    您可以将“泛型类型”视为“具有泛型参数的类型”的简写,但这些泛型参数可以是以下任何一种或全部:

    1. 泛型类型参数(如Vec&lt;T&gt;);

    2. 通用生命周期参数(如type Ref&lt;'a&gt; = &amp;'a i32);

    3. 通用 const 参数 (real soon now)。

    “泛型函数”=“具有泛型参数的函数”也是如此。

    您可以将其缩短为“生命周期参数”,因为所有生命周期参数(并非所有生命周期!)都是通用的。这同样适用于类型参数。

    但我仍然不明白这是如何使 ' 成为通用的,而不是简单地接受各种值的参数

    生命周期参数和类型参数有一些共同点,它们必须在一起,但在 Rust 中却有:

    1. 最明显的:它们写在&lt;&gt;而不是()之间;

    2. 它们可以被推断出来;

    3. 代码不能根据它们的值进行分支。

    因此它们被归为“通用参数”而不是“值参数”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-08
      • 2020-01-06
      • 2021-08-10
      • 2015-12-08
      相关资源
      最近更新 更多