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 协议》,转载必须注明作者和本文链接
关于 LearnKu
推荐文章: