了解在 Rust 中使用“*”取消引用
Understanding de-referencing using '*' in rust
struct Abc {
a: i32,
}
fn main() {
let mut abc = Abc { a: 30 };
let xyz = &abc;
let q = *xyz;
}
编译代码出现以下错误:
error[E0507]: cannot move out of borrowed content
--> src/main.rs:11:13
|
11 | let q = *xyz;
| ^^^^
| |
| cannot move out of borrowed content
| help: consider using a reference instead: `&*xyz`
请帮助我了解这里出了什么问题。
当你在Rust中写let a = b;
时,b
的值被移动到a
,变量b
] 不再可用。
在您的例子中,xyz
是对 abc
的引用,因此 *xyz
与 abc
是一回事。移动 abc
是一个错误,因为引用 xyz
仍然存在,但现在指向无效内存。
如果您对为什么像 i32
这样的数字类型没有发生这种情况感到困惑,那是因为大多数简单的原语都实现了 Copy
特性。这是标记特征,它告诉编译器复制内存中的值,而不是移动它。对于小型类型,这与通过引用传递的性能相同(有时甚至更好)。
参见:
struct Abc {
a: i32,
}
fn main() {
let mut abc = Abc { a: 30 };
let xyz = &abc;
let q = *xyz;
}
编译代码出现以下错误:
error[E0507]: cannot move out of borrowed content
--> src/main.rs:11:13
|
11 | let q = *xyz;
| ^^^^
| |
| cannot move out of borrowed content
| help: consider using a reference instead: `&*xyz`
请帮助我了解这里出了什么问题。
当你在Rust中写let a = b;
时,b
的值被移动到a
,变量b
] 不再可用。
在您的例子中,xyz
是对 abc
的引用,因此 *xyz
与 abc
是一回事。移动 abc
是一个错误,因为引用 xyz
仍然存在,但现在指向无效内存。
如果您对为什么像 i32
这样的数字类型没有发生这种情况感到困惑,那是因为大多数简单的原语都实现了 Copy
特性。这是标记特征,它告诉编译器复制内存中的值,而不是移动它。对于小型类型,这与通过引用传递的性能相同(有时甚至更好)。
参见: