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

Not*_*ist 2 ownership rust

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

我在这里错了(也就是意外工作),或者我的参考仍然有效吗?

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);
}
Run Code Online (Sandbox Code Playgroud)

锈操场输出:

Hello, world!
MyStruct 3
i 3
Run Code Online (Sandbox Code Playgroud)

lje*_*drz 9

let表达式获得图案匹配和

let &i = get(&x); // i.e. a &i32
Run Code Online (Sandbox Code Playgroud)

结果在i被分配到i32既然i32是拷贝,但没有所有权的侵犯.

Rust引用声明"let语句引入了一组新的变量,由模式给出"()和"模式由文字,结构化数组或枚举构造函数,结构和元组,变量绑定规范的某种组合组成"(来源)).

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

let &i = get(&x);
Run Code Online (Sandbox Code Playgroud)

相当于

let i = *get(&x);
Run Code Online (Sandbox Code Playgroud)

所以x不是借来的,pr(x)仍然适用.