我正在使用函数(名为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);
}
Hello, world!
MyStruct 3
i 3
答案 0 :(得分:9)
let
表达式与模式匹配且
let &i = get(&x); // i.e. a &i32
i
分配给i32
且i32
以来的结果是可复制的,没有所有权违规。
Rust引用声明“let语句引入了一组新的变量,由模式给出”(source)和“模式由文字,结构化数组或枚举构造函数,结构和元组组合而成” ,变量绑定规范“(source)。
绑定的左侧,&i
不仅仅是一个文字,它告诉编译器它应该尝试与右侧表达式进行模式匹配。在这种情况下,它会导致i
指向可复制值(i32
)而不是引用(&i32
)。换句话说:
let &i = get(&x);
相当于
let i = *get(&x);
因此x
未被借用且pr(x)
仍适用。