为什么在生命周期参数中使用'generic'这个词?

Why use the word 'generic' in lifetime parameters?

当我们写:

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

为什么我们不直接将 'a'b 称为 生命周期参数 而不是 通用参数生命周期参数?它只是一种语法方式,可以根据参数的生命周期向编译器传达对返回引用生命周期的约束。我正在努力寻找包含“通用”一词的理由 here

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

明显的反例是 '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
}

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

"Generic" makes me think of generic types, but as far as I can tell it has no relevance here.

您可以将“通用类型”视为“具有通用参数的类型”的 shorthand,但这些通用参数可以是以下任何一个或全部:

  1. 通用类型参数(如 Vec<T>);

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

  3. 泛型常量参数 (real soon now)。

“通用函数”=“具有通用参数的函数”。

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

but I still don't see how that makes 'a generic as opposed to simply a parameter which takes various values

生命周期参数和类型参数有一些共同点没有,但在 Rust 中有:

  1. 最明显的:它们写在< >之间而不是( );

  2. 可以推断;

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

所以它们被组合在一起作为“通用参数”而不是“值参数”。