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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!