見出し画像

Rust 所有権とムーブの使い方と注意点について

Rustの所有権とムーブは、言語の安全性とパフォーマンスを支える重要な概念です。

所有権はメモリ管理を通じてリソースの安全な操作を可能にし、ムーブはデータの所有権の移動を制御します。


所有権

所有権は変数や値に関する一意的な制御権を表します。

Rustでは各値に所有者が一人だけ存在し、所有者が変わると古い所有者はもはやその値にアクセスできなくなります。

fn main() {
    let s1 = String::from("hello"); // `s1`がこのStringの所有者
    let s2 = s1; // `s1`から`s2`へ所有権が移動
    println!("{}", s2); // 正常に動作

    // println!("{}", s1); // エラー:`s1`の所有権が移動しているため
}

s1からs2への所有権のムーブが行われています。ムーブの後、s1は無効化されるため、アクセスするとエラーになります。


ムーブ

ムーブは、所有権を一つの変数から別の変数に移動する操作です。ムーブは、データを複製せずに移動するため、高効率です。


クローン

ムーブと対照的に、クローンはデータをコピーして新しいインスタンスを作成します。クローンを使うことで、オリジナルのデータを保持しつつ新しいデータを作成できます。

fn main() {
    let s1 = String::from("hello");
    let s2 = s1.clone(); // クローンによるデータのコピー
    println!("{}", s1); // 正常に動作
    println!("{}", s2); // クローンによって複製された値
}

クローンを使ってデータをコピーしているため、両方の変数にアクセスできます。


注意点

所有権のムーブとスコープ

所有権はスコープによって制御されます。
ムーブによって所有権が移動すると、元の変数はスコープから外れるため、適切に管理する必要があります。


シャローコピーとディープコピー

ムーブはシャローコピであり、クローンはディープコピーです。ムーブは効率的ですが、必要な場合はクローンを使ってデータを維持します。


Copyトレイト

数値型やコピー可能なプリミティブ型は、ムーブではなくコピーされます。
これらの型は所有権のムーブが起こらないため、通常通り複製しても元の変数にアクセスできます。


リファレンスと借用

所有権が移動する代わりに、リファレンスを使ってデータを借用することも可能です。
借用は、所有権を移動せずにデータにアクセスするための方法であり、スコープが終了すると自動的に無効化されます。



Rustをもっと詳しくなりたい方に

Rustプログラミング完全ガイド 他言語との比較で違いが分かる!

個人的には他の言語開発もそれなりにあったことからこの本を読むことでかなりRustへの理解が深まりました。
プログラムやシステム的な専門用語は当たり前に登場するものの、他の言語での開発経験がある方なら問題ないでしょう。むしろその経験があることで、多言語との比較をしながら読み進めることができます。
内容的には大容量かつ丁寧すぎるほど嚙み砕いて説明がされているため、情報量は十分といえます。Rust自体学習コストが高く、難易度の高い言語のためこのくらいが妥当といえます。
プログラミング初心者レベルの方には難しい内容となっていますが、Rustの概念を理解し、基礎を把握することができる本であること間違いなしです。

Rust学習のために筆者が実際に読んでおすすめしたい本をまとめています。


基礎から学ぶRustプログラミング入門

本コースではRustについて全く経験がない方でもスムーズに学習を進められるようにとなっています。
基本的にはコードベースで解説を行い、抽象度が高く難しい内容に関しては適宜スライドも使いながら丁寧に解説します。そしてただ文法を学ぶだけではなく、最終的には演習としてCLIアプリケーションを作成し学習内容の定着を図ります。

以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。

※本ページではアフィリエイトリンク(PR)が含まれています


この記事が参加している募集

#この経験に学べ

54,021件

この記事が気に入ったらサポートをしてみませんか?