作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在lifetime_things
的定义中,'b
的生命周期比'a
长,但实际上当我调用这个函数时,x1
比y1
长,但是这样可以编译成功:
//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 上都有效。这适用于 x1
和 y1
, 所以这一切都检查出来了。
关于rust - Rust 中的生命周期如何为函数工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67846493/
我是一名优秀的程序员,十分优秀!