这里有一个很好的Rust移动语义示例: Rust Move Semantics在Rust By Example网站上有记录。
我基本理解了所示范的两种情况。第一种是如何给基本类型创建一个新的别名,因为i32使用Copy
特性,所以原始值仍然可以使用,因为最终结果是副本。这对我来说很有意义。
此外,出于许多很好的原因,第二个示例在具有指向堆上i32的多个别名方面是有意义的。 Rust强制执行所有权规则,因此现在创建了一个新绑定后,无法使用原始别名。 这有助于防止数据竞争,双重释放等。
但似乎还有第三种情况没有被讨论到。 Rust如何实现不实现Copy
特性的栈分配结构体的移动? 以下代码说明了这一点:
#[derive(Debug)]
struct Employee{
age: i32,
}
fn do_something(m: Employee){
println!("{:?}", m);
}
fn main() {
let x = Employee {
age: 25,
};
do_something(x);
//compiler error below because x has moved
do_something(x);
}
我知道的是:在上面的情况下,Rust将在堆栈上分配“Employee”。 上述结构体未实现“Copy”特征,因此在分配给新别名时不会被复制。这对我来说非常令人困惑,因为如果“Employee”结构体分配在堆栈上,并且也没有实现“Copy”特性,那么它如何移动?它是否在“do_something()”的堆栈帧中物理移动?任何关于解释这个谜题的帮助都将不胜感激。
Employee
结构体简化并且至少移除生命周期会更好。比如说,struct Employee { age: i32 }
就足够了。 - Lukas Kalbertodt