Rust 基礎からマスターまで — 第1回
所有権と借り入れでメモリを安全に扱う
本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。
Rustは、Garbage Collectorなしでメモリの安全性を守ることを目的としたシステムプログラミング言語です。 パフォーマンスが重要なプログラムを作成しながら、間違ったポインタとデータ競合をコンパイル段階で減らそうとします。
値に所有者がある
Rustの値は基本的に1つの所有者を持っています。 所有者が有効範囲外の場合、値は自動的にクリーンアップされます。
fn main() {
let name = String::from("Rose");
print_name(name);
//nameの所有権は関数に移動しました。
}
fn print_name(value: String) {
println!("{value}");
}
Stringを関数に値として渡すと、所有権が移動します。 呼び出した方でも使い続けたい場合は値を貸してくれる。
参照で値を借りる
fn main() {
let name = String::from("Rose");
print_name(&name);
println!("{name}");
}
fn print_name(value: &String) {
println!("{value}");
}
&Stringは値を所有せずにしばらく読む参照です。 値を変更するには&mut String同様に、変更可能な参照を使用する必要があります。
同じ時点で複数の変更可能な参照を作成するのを防ぐための規則は最初は難しいです。 代わりに、実行中に発生する可能性のある誤ったメモリアクセスと競合状態を予防します。
失敗の可能性をタイプで表現する
Rustでは、値が存在しない可能性を Option<T>、処理が失敗する可能性を Result<T, E> で表すことが多い。
fn divide(a: i32, b: i32) -> Result<i32, String> {
if b == 0 {
return Err(String::from("0 に分割できません。"));
}
Ok(a / b)
}
呼び出されたコードは成功と失敗を明示的に処理しなければなりません。 エラーを無視しにくくすることもRustの安全性に含まれています。
Rustプロジェクトはcargo new, cargo run, cargo test同じCargoコマンドで管理します。 最初は、所有権ルールをすべて覚えるよりも小さいコマンドラインプログラムを作成し、コンパイラメッセージに従い、借り手の範囲を確認するのが良い。