rust-quiz:012-binding-drop-behavior.rs
题目
struct D(u8);
impl Drop for D {
fn drop(&mut self) {
print!("{}", self.0);
}
}
struct S {
d: D,
x: u8,
}
fn main() {
let S { x, .. } = S {
d: D(1),
x: 2,
};
print!("{}", x);
let S { ref x, .. } = S {
d: D(3),
x: 4,
};
print!("{}", x);
}
关键
当对象生命周期结束之后,才会进行drop
。
额外的地方需要注意两点
- 引用:如果存在引用,是不会进行
drop
的 - 转移:当发生
move
的时候,可以看做老变量的移除,需要drop
最奇葩的
move
,不是值转移,而是值唯一。
当二次进行声明的时候,为了保证一个值就只有一个引用。
第二个值绑定会强制取消第一个值绑定,就会调用drop
。
题解
这里主要问题是在于,匹配的对象的生命周期。
对于第一个
let S { x, .. } = S {
d: D(1),
x: 2,
};
print!("{}", x);
因为作为值匹配,S
中的值,在匹配完成以后就move
了。
因此,这里会对内部的变量进行drop
,执行D(1)
中的drop
,打印12
。
第二个
let S { ref x, .. } = S {
d: D(3),
x: 4,
};
print!("{}", x);
这里主要是使用的是ref x
,实际上获取的是一个引用,并没有发生值的move
。
因此,原始的值随时都可能继续使用,只有在程序结束才进行drop
。
这里会打印43
。
答案
1243
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: