コンパイラは最初の変数をも無効化するので、shallow copyと呼ばれる代わりに、 ムーブとして知られているわけです。この例では、s1はs2にムーブされたと表現するでしょう。 以上より、実際に起きることを図4-4に示してみました。
図4-4: s1が無効化された後のメモリ表現
図で見ると分かりやすい。
s1の値というかポインタはs2に渡った時点で解放されていることを示していると。ゆえに「ムーブ」と呼び、所有権が渡っていることを示しているのかな
s2だけが有効なので、スコープを抜けたら、それだけがメモリを解放して、 終わりになります。
付け加えると、これにより暗示される設計上の選択があります: Rustでは、 自動的にデータの"deep copy"が行われることは絶対にないわけです。
ちなみ、図の左側は「スタック」右側が「ヒープ」を示している
例外
copyトレイトに適合している型であれば、ムーブはされず、コピーもと?の値もそのまま使用できる
copyに適合している型の例
あらゆる整数型。u32など。
論理値型であるbool。trueとfalseという値がある。
あらゆる浮動小数点型、f64など。
文字型であるchar。
タプル。ただ、Copyの型だけを含む場合。例えば、(i32, i32)はCopyだが、 (i32, String)は違う。
関数と所有権
関数に値を渡しても、先ほどのように値のムーブ、コピーは発生する
関数の返り値にしてもムーブは当然発生する
。。。なるほど、所有権について考えすぎると大変というか脳内グルグルしてくるわけだ。そんな訳で、どんどん複雑になってくるのを対応するために「参照」があるらしい。また明日