【发布时间】:2019-12-18 17:47:32
【问题描述】:
考虑以下程序:
fn main() {
let c; |<-'a
let mut a = "Hello, world!".to_string(); |
{ |
let b = &mut a; |<-'b |
c = foo(b); | |
} |
println!("{}", c) |
}
fn foo<'z>(a: &'z mut str) -> &'z str {
a
}
b 的生命周期是 'b,但 c 的生命周期是 'a,比 'b 长。 foo 的生命周期约束表明 foo 的返回值(本例中为 c)与其参数(本例中为 b)应具有相同的生命周期。 foo 的生命周期约束如何满足?
但是,这个程序可以编译,所以我猜 foo 的生命周期参数 'z 实现为 b 的引用值 (a) 的生命周期,因此满足 foo 的生命周期约束?
【问题讨论】:
-
看来您刚刚回答了自己的问题。你还期待什么?
-
只是想确认一下我的逻辑和猜测是否正确,我的猜测有没有例外?
-
b的类型为&'a mut str。引用的生命周期将是拥有该值的范围。在这种情况下,您没有将a移动到'b,因此您的引用仍然是&'a。然而,如果你将&b传递给foo(即使类型匹配),你会得到错误,因为b存在于'b中。 -
借用表达式的生命周期不一定与任何变量的生命周期相同。编译器不必从输入生命周期中选择输出生命周期,它可以创建一个“新”生命周期来满足任何存在借用表达式的要求。 (另请注意
foo(b)进行隐式重借,因此c的类型和b的类型不需要具有相同的生命周期参数)