给出的示例为
fn main() {
let v = 0u64;
let mut a = A {
x: "hello".to_string(),
y: &v,
};
a.hello();
a.world();
}
struct A<'a> {
x: String,
y: &'a u64,
}
impl<'a> A<'a> {
fn hello(&'a mut self) {
self.world();
self.x = "hello123".to_string();
let _ = *self.y;
self.world();
}
fn world(&mut self) {
self.x = "world".to_string();
}
}
字符串
生成它会产生错误,因为
|
9 | a.hello();
| --------- first mutable borrow occurs here
10 | a.world();
| ^^^^^^^^^
| |
| second mutable borrow occurs here
| first borrow later used here
型
然而,改变A::hello
的签名(即消除显式的'a
注解)
fn hello(&mut self)
型
将修复程序。
1条答案
按热度按时间huus2vyu1#
问题不在于显式的生存期,它对可变借用和
A
内部的数据使用了相同的生存期。当我们写出被省略的生存期时,没有显式注解的版本变成字符串
通过强制
'a
和'b
相同(在本例中,通过重用'a
),您告诉编译器self
的借用应该持续与A
内部的引用一样长的时间,并且由于存储在A
内部的所有引用都必须比它更长,因此至少直到A
超出范围。这意味着一旦调用了hello
,A
的示例在其剩余的生命周期内都将被借用,因为该借用是独占的,您不能在其他任何地方借用它。对于
world
函数,这个问题不存在,因为您没有在它的borrow上强制内部生存期。