我正在使用函数(命名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)
的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)仍然适用.
| 归档时间: |
|
| 查看次数: |
395 次 |
| 最近记录: |