【发布时间】:2022-12-19 14:07:48
【问题描述】:
在 Rust 中,值的生命周期介于定义点和超出范围的点之间。
然而,超出范围可以是声明的结尾抢断价值。
Rust 仅部分尊重这一点。为什么?
举个例子:
// This is the starting point, it compiles without errors/warnings, but does not do what it should.
struct Inner{x : i32}
struct Outer<'e>{
s : &'e Inner,
c : i32
}
fn print_inner_value(mut o : Outer) {
println!("o.s.x = {:?}", o.s.x);
o.c += 1;
}
fn change_inner(mut o : Outer) {
let new_i = Inner{x : 40};
o.c += 2;
//o.s = &new_i;
print_inner_value(o);
println!("new_i.x = {:?}", new_i.x);
//o.c += 3;
}
fn main () {
let orinal_i = Inner {x : 10};
let mut o = Outer{s : &orinal_i, c : 0};
o.c += 4;
change_inner(o);
}
我真正想要的是o.s = &new_i; 行不被评论。
但如果我这样做,我会得到 E0597 说 new_i 的寿命不够长。
但它似乎活得足够长,因为如果我改为取消注释 o.c += 3; 然后我得到 E0382 说 o.c 不能使用,因为它已被移动。
很明显,在println!("new_i.x = {:?}", new_i.x); 行,值new_i 处于活动状态,而值o 已移至已结束的函数中,因此它不应再处于活动状态。
所以问题是:为什么移动一个值会缩小它的范围,但不会缩短它的生命周期?
【问题讨论】:
-
可以允许此特定代码。但是你可以重新绑定
o使其编译。