Rust一生的概念对我来说很困惑。我有以下两个功能:
fn test1<'a, 'b: 'a>(x: &'a u32, y: &'b u32) -> &'a u32 {
if x > y {
x
} else {
y
}
}
fn test2<'a, 'b: 'a>(x: &'b u32, y: &'a u32) -> &'a u32 {
if x > y {
x
} else {
y
}
}
fn main() {
let a = 5;
{
let b = 6;
let c = test1(&a, &b);
println!("{}", c);
}
{
let b = 6;
let c = test2(&a, &b);
println!("{}", c);
}
}
该程序可以编译,结果是
6
6
但是,我无法弄清 test1 和 test2 之间的区别
有人可以解释吗?
最佳答案
TLDR:没有实际区别。
您必须了解的是,Rust生命周期指示不是严格的相等声明,而是表示“比”更长的关系。所以当你写:
fn foo<'a> (x: &'a i32)
您正在告诉编译器:“为了调用
foo
,必须存在一些生存期的'a
,并且x
的生存期至少应与'a
一样长(但是x
的生存期可能会更长)。”回到您的函数定义:
fn test1<'a, 'b: 'a>(x: &'a u32, y: &'b u32) -> &'a u32
这表示:
'a
,以便x
的生命周期至少与'a
一样长(但生命周期可能更长)。 'b
,该生命周期至少与'a
一样长(但可以相同),以便y
的生命周期至少与'b
一样长(但生命周期更长)。 'a
。 由于对
'b
没有其他约束,因此编译器始终可以自由选择'b = 'a
,并且只要满足'a
的约束,代码就可以编译。当您调用该函数时,编译器将搜索与上述约束匹配的一些生存期
'a
和'b
:let a = 5;
{
let b = 6;
let c = test1(&a, &b);
println!("{}", c);
}
'a
,因此'a
必须在函数调用处开始(因为返回值之前不存在),并最早在结束括号处结束。 x
是a
,且x
的生存时间至少应与'a
一样长。由于a
是在函数调用之前定义的,并且在结束括号处仍然有效,所以一切都很好。 y
是b
,且y
的生存时间至少应与'b
一样长。如果我们选择'b = 'a
,那么一切都很好,因为b
是在函数调用之前定义的,并且一直存在到右括号为止。 因此,编译器选择
'a == 'b
从函数调用开始,到结束括号为止。变量a
和b
的生存期都比这更长,但这很好,因为参数的生存期注释是相应变量的真实生存期的下限。注意:相同的推理适用于您的第二个函数,并且只要满足所有其他约束,编译器就可以始终选择
'b = 'a
。
关于rust - 此 rust 功能与生命周期之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60964731/