变量被隐藏的值的所有权

Ownership of values whose variables are shadowed

查看下面的一些代码:

#[derive(Debug)]
struct MyString {
    a: String,
}

impl MyString {
    fn new(s: &str) -> Self {
        MyString { a: String::from(s) }
    }
}

impl Deref for MyString {
    type Target = String;

    fn deref(&self) -> &Self::Target {
        &self.a
    }
}

impl Drop for MyString {
    fn drop(&mut self) {
        println!("{} dropped!", self.a);
    }
}

fn main() {
    let mut test1 = MyString::new("test1");
    let mut test1 = MyString::new(&test1);
    println!("shadow variable test1");
    test1.a = String::from("test2");
}

我以为应该是编译错误,因为test1还是借用的

但是没有编译错误,结果是

shadow variables test1
test2 dropped
test1 dropped

所以如果一个变量被隐藏了,这个值在当前范围内仍然有效。 但它的主人是谁?

从所有权的角度来看,您的代码完全等同于:

fn main() {
    let mut test1_1 = MyString::new("test1");
    let mut test1_2 = MyString::new(&test1_1);
    println!("shadow variable test1");
    test1_2.a = String::from("test2");
}

所以 test1_1main 函数结束时超出范围时被丢弃。

另请注意,test1_2 借用 test1_1,借用只持续到 MyString::new(&test1) 的调用。之后两个变量之间就没有联系了。