Rustの移動セマンティクスの素晴らしい例がここに記載されています:Rust Move Semantics、Rust By ExampleのWebサイトRustはどのようにコピー可能ではないスタック変数を移動しますか?
私は両方のケースについて基本的な理解を示しています。最初のものはプリミティブが新しいエイリアスを持つ方法で、最終結果はi32
というコピーがCopy
の特性を利用するため、そのまま使用することができます。これは私には分かりやすい。
さらに、多くの理由から、2番目の例は、ヒープ上のi32
を参照する複数のエイリアスを持つ点で意味があります。錆はオーナーシップルールを強制するため、新しいバインディングが作成されたので元のエイリアスを使用することはできません。これは、データ競合、二重解放などを防ぐのに役立ちます。
しかし、話されていない3番目のケースがあるようです。 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);
}
この私が知っている:上記の場合、錆がスタックにEmployee
を割り当てます。上記の構造体はのCopy
特性を実装していないため、新しいエイリアスに割り当てられたときにはコピーされません。これは私にとって非常に混乱しています。なぜなら、Employee
構造体がスタック上に割り当てられていて、どのように移動するのでしょうか?Copy
特性を実装していないからです。それは物理的にdo_something()
のスタックフレームに移動しますか?
この問題については、何か助けてください。
あなたの例を単純化してもよろしいですか? 'Employee'構造体をあまり複雑でなくても、少なくとも生涯を削除するには素晴らしいでしょう。 'struct Employee {age:i32}'で十分でしょう。 –
@LukasKalbertodt - はい私は例を単純化しました。 –