移动结构后,我对结构成员的引用如何仍然有效?

时间:2016-09-20 05:25:41

标签: rust ownership

我正在使用函数(名为get)创建对结构成员的引用,然后使用另一个函数(名为pr)移动结构,然后我取消引用先前创建的指针。

我在这里犯了错误(a.k.a。意外地工作),或者我的参考仍然有效吗?

struct MyStruct {
    inner: i32,
}

fn get(a: &MyStruct) -> &i32 {
    return &a.inner;
}

fn pr(a: MyStruct) {
    println!("MyStruct {}", a.inner);
}

fn main() {
    println!("Hello, world!");
    let x = MyStruct { inner: 3 };
    let &i = get(&x);
    pr(x);
    println!("i {}", i);
}

Rust playground输出:

Hello, world!
MyStruct 3
i 3

1 个答案:

答案 0 :(得分:9)

let表达式与模式匹配且

let &i = get(&x); // i.e. a &i32

i分配给i32i32以来的结果是可复制的,没有所有权违规。

Rust引用声明“let语句引入了一组新的变量,由模式给出”(source)和“模式由文字,结构化数组或枚举构造函数,结构和元组组合而成” ,变量绑定规范“(source)。

绑定的左侧,&i不仅仅是一个文字,它告诉编译器它应该尝试与右侧表达式进行模式匹配。在这种情况下,它会导致i指向可复制值(i32)而不是引用(&i32)。换句话说:

let &i = get(&x);

相当于

let i = *get(&x);

因此x未被借用且pr(x)仍适用。