【发布时间】:2021-12-20 12:08:45
【问题描述】:
我在 rust 中看到了一个名为 drop(T) 的构建函数,基本上,它会移动给定的变量。
假设我们有如下代码:
struct Obj {
a: i32,
}
impl Drop for Obj {
fn drop(&mut self) {
println!("> Dropping {}", self.a);
}
}
fn main() {
let mut m = &Obj { a: 5 };
m = &Obj { a: 6 };
m = &Obj { a: 7 };
m = &Obj { a: 8 };
let t = thread::spawn(|| {
for i in 0..5 {
println!("Counting {}", i);
thread::sleep(Duration::from_secs_f32(1.0));
}
});
t.join().unwrap();
}
结果是:
> Dropping 6
> Dropping 7
> Dropping 8
Counting 0
Counting 1
Counting 2
Counting 3
Counting 4
> Dropping 5
由于结果显示刚辞职后6到8就被收集了,所以起源5一直持续到main结束。为什么一开始就没有收集到 5?
【问题讨论】:
-
在其范围结束时,该范围内拥有的所有内容都将被删除(“清理”)。
-
@Netwave 在代码的情况下,我可以在 main 结束前手动清理 Obj{5}
-
@Netwave 不会编译,你不能移出引用。
-
@EnXie 你可以保持它的名字(因为它是一个匿名的临时文件)并预先删除它的所有引用,但这不会做任何有用的事情,因为它没有实现
Drop. -
@Masklinn,是的,我实际上是在构建正确的答案。
标签: rust