gpt4 book ai didi

rust - Rust 中的生命周期如何为函数工作?

转载 作者:行者123 更新时间:2023-12-04 07:33:29 29 4
gpt4 key购买 nike

lifetime_things的定义中,'b的生​​命周期比'a长,但实际上当我调用这个函数时,x1y1长,但是这样可以编译成功:

//here you could see 'b:'a means, the lifetime of b should be larger than a,
fn lifetime_things<'a,'b:'a>(x:&'a String, y:&'b String) ->&'a String {
if x.len() > y.len() {
&x
} else {
&y
}
}

fn main() {
let z: i32;
let x = String::from("1");
let x1=&x;
{
let y = String::from("2");
let y1=&y;
println!("{}",lifetime_things(x1,y1));
}
}

但是在这里你可以看到x1的生​​命周期应该比y1大,为什么这样也能编译成功呢?

最佳答案

'b: 'a表示 'b必须比 'a 长寿,这又意味着每当 'a是活的,所以必须'b .至关重要的是,这是一种大于或等于的关系。另请注意,生命周期不像类型那样工作。当函数接受 'v 时引用,任何生命周期( 'w )都将被接受,只要 'w: 'v .

那么,'a 在哪里?居住?在函数体中以及调用后使用返回的字符串引用时。我们可以这样想象它:

fn lifetime_things<'a,'b:'a>(x:&'a String, y:&'b String) ->&'a String {
if x.len() > y.len() { // <-+
&x // |
} else { // |
&y // +----+
} // | |
} // <-+ |
// |
fn main() { // +-- 'a
let z: i32; // |
let x = String::from("1"); // |
let x1=&x; // |
{ // |
let y = String::from("2"); // |
let y1=&y; // |
println!("{}",lifetime_things(x1,y1)); // <------+
}
}

注意,由于 lifetime_things 返回的值仅打印,'a只直播上线println!("{}",lifetime_things(x1,y1)); (不包括 lifetime_things 的 body )。

所以,调用lifetime_things我们只需要至少的两个论点在电话 session 上都有效。这适用于 x1y1 , 所以这一切都检查出来了。

关于rust - Rust 中的生命周期如何为函数工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67846493/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com