Generics 为什么要用';通用';生命周期参数?
当我们写作时:Generics 为什么要用';通用';生命周期参数?,generics,rust,reference,lifetime,lifetime-scoping,Generics,Rust,Reference,Lifetime,Lifetime Scoping,当我们写作时: fn-foo(x:&'a u32,y:&'b u32)->&'a u32{ x } 为什么我们不把'as和'bs称为生存期参数,而不是一般的生存期参数?这只是一种语法方式,可以根据参数的生存期向编译器传递返回引用的生存期约束。我很难理解加入“通用”一词的理由。我们在“寿命参数”前面使用“通用”一词,因为它们是通用寿命参数 明显的反例是“static,这是唯一的非匿名生存期,因此我们可以在通用上下文之外引用它。另一方面,由于所有其他可能的生存期都是匿名的,因此我们可以引用它们的唯
fn-foo(x:&'a u32,y:&'b u32)->&'a u32{
x
}
为什么我们不把'a
s和'b
s称为生存期参数,而不是一般的生存期参数?这只是一种语法方式,可以根据参数的生存期向编译器传递返回引用的生存期约束。我很难理解加入“通用”一词的理由。我们在“寿命参数”前面使用“通用”一词,因为它们是通用寿命参数
明显的反例是“static
,这是唯一的非匿名生存期,因此我们可以在通用上下文之外引用它。另一方面,由于所有其他可能的生存期都是匿名的,因此我们可以引用它们的唯一方法是通过泛型生存期参数
下面的foo
函数可以在理论上无限多个不同的可能生存期内调用,它在所有这些情况下都有效,因为它在生存期内是通用的。下面是一个使用两种不同生命周期调用它的示例:
fn foo&'a i32{x}
fn main(){
foo(&1);//使用“静态生存期”调用
设x=1;
foo(&x);//使用x的匿名生存期调用
//等等
}
两个调用中输入参数和输出返回类型之间的生存期约束关系相同,但生存期不同
“泛型”让我想到泛型类型,但据我所知,它在这里没有相关性
您可以将“泛型类型”视为“具有泛型参数的类型”的简写,但这些泛型参数可以是以下任意或全部参数:
Vec
)
类型ref中所示,谢谢您的回答,但我仍然不明白这是如何使'a
成为泛型的,而不仅仅是一个接受各种值的参数(其中'static
)。你是说,'static
与-life-of-x是不同的类型吗?特别是,foo
可以用无限多个参数调用,不是因为它是x
的泛型,而是因为参数x
可以用无限多个参数值传递。@JSStuball'a
是一个泛型的生命周期参数“代码< >代码>静态< /代码>不是一般的生命周期参数。<代码>静态代表一个非常特殊的生命周期。就像<代码> i32 不是一个泛型类型。是的,生命周期会影响类型。考虑类型<代码> FooIIS,代码< >和'i32 和<代码>和'bI32 < /C> >被认为是不同的类型?曾将生存期注释视为与传递给函数的参数相关联的信息,而不是实际的类型信息。这种语义调整似乎证明了在我们讨论生存期的任何地方都可以使用泛型这个术语。@JSStuball是的,&'a i32
和&'b i32
在'a时是不同的类型
和'b
是不同的生命周期。但是,很难观察到这一点,因为编译器试图统一生命周期以使代码能够编译。