当我们写:
fn foo<'a, 'b>(x: &'a u32, y: &'b u32) -> &'a u32 {
x
}
为什么我们不将'a
s 和'b
s 称为生命周期参数而不是通用生命周期参数?这只是一种语法方式,可以根据参数的生命周期向编译器传达对返回引用的生命周期的约束。我正在努力寻找在此处包含“通用”一词的理由。
我们在“生命周期参数”前面使用“通用”一词,因为它们是通用生命周期参数。
明显的反例是'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
}
两个调用中输入参数和输出返回类型之间的生命周期约束关系相同,但生命周期不同。
“泛型”让我想到泛型类型,但据我所知,它在这里没有相关性。
您可以将“泛型类型”视为“具有泛型参数的类型”的简写,但这些泛型参数可以是以下任何一种或全部:
泛型类型参数(如Vec<T>
);
通用生命周期参数(如type Ref<'a> = &'a i32
);
通用 const 参数(现在很快)。
“泛型函数”=“具有泛型参数的函数”相同。
您可以将其缩短为“生命周期参数”,因为所有生命周期参数(不是所有生命周期!)都是通用的。这同样适用于类型参数。
但我仍然不明白这是如何使 ' 成为通用的,而不是简单地采用各种值的参数
生命周期参数和类型参数有一些共同点,它们不必放在一起,但在 Rust 中可以:
最明显的:它们写在<
>
and not之间(
)
;
它们可以被推断出来;
代码不能根据它们的值进行分支。
因此,它们被分组为“通用参数”,而不是“值参数”。