请考虑以下程序:
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
内部。 - SOFefoo(b)
进行了隐式重新借用,因此c
的类型和b
的类型不需要具有相同的生命周期参数) - trent