【Rust入門】さらば「ぬるぽ」!Option/Result型によるエラー処理とコレクション(Vec/String)の徹底攻略

この記事は約4分で読めます。
スポンサーリンク

他の言語でプログラミングをしているとき、NullPointerException(いわゆる「ぬるぽ」)に悩まされたことはありませんか? Rustには、そもそも「Null」という概念が存在しません。その代わりに、値があるかないかを安全に扱うOption型と、失敗する可能性を管理するResult型が用意されています。

今回は、Rustの安全性と便利さを支える「エラー処理」と、データをまとめて扱う「ベクタ(Vec)」や「文字列(String/&str)」の正体を解き明かしていきましょう!

1. 「値がない」を恐れない:Option型

RustにはNullがありません。その代わりに、「値があるかもしれないし、ないかもしれない」という状態をOption型というEnumで表現します。

Option型の基本形

let some_number = Some(5);
let no_number: Option<i32> = None;
  • Some(T):値が存在する状態
  • None:値が存在しない状態

どうやって中身を取り出す?

中身を無理やり取り出すには .unwrap() を使いますが、もし中身が None だった場合、プログラムが強制終了(パニック)してしまいます。

let x: Option<i32> = None;
// let value = x.unwrap(); // ここでパニック!「ぬるぽ」と同じ恐怖

安全な取り出し方(match式) 前回の記事で学んだ match を使うのが最も確実です。

match x {
    Some(i) => println!("値は{}です", i),
    None => println!("値はありませんでした"),
}

2. 失敗をチャンスに変える:Result型

次に、処理が「成功したか失敗したか」を表すResult型です。ファイルの読み込みや計算など、エラーが起こりうる場面で多用されます。

  • Ok(T):成功。中身に値が入っている。
  • Err(E):失敗。中身にエラー内容が入っている。

「?」演算子でスマートに書く

Rustには、エラーが発生した瞬間にその関数を終了してエラーを返す「?演算子」という非常に便利な仕組みがあります。

// イメージ:ファイルの読み込みなどが失敗したら即座にErrを返す
let result = perform_action()?; 

3. データの動的リスト:ベクタ(Vec)

同じ型のデータをたくさん並べて管理したいときに使うのがベクタ(Vec)です。 配列と似ていますが、ベクタは「後から要素を増やしたり減らしたりできる」のが最大の特徴です。

let mut v = Vec::new();
v.push(1);
v.push(2);
v.push(3);

// マクロを使って簡単に作成も可能
let v2 = vec![10, 20, 30];

// 要素を取り出す(Option型が返ってくる!)
let second = v.get(1); // Some(&2) が返る

ここでポイントなのは、v.get() の戻り値が Option 型であることです。インデックス範囲外を指定しても、エラーで落ちるのではなく None が返ってくるため、安全に処理が書けます。


4. Rust最大の難所:String と &str の違い

初心者が最も混乱するのが「文字列」です。Rustには主に2種類の文字列があります。

String(所有権あり)

  • 特徴:中身を変更できる(可変)、ヒープ領域に保存される。
  • イメージ:中身を詰め替えられる「スーツケース」。
  • いつ使う?:ユーザー入力など、後から文字列を加工したいとき。

&str(文字列スライス / 参照)

  • 特徴:中身を変更できない(不変)、データの場所を指し示しているだけ。
  • イメージ:中身を覗き見るための「のぞき窓」。
  • いつ使う?:関数の引数や、固定の文字列リテラルを扱うとき。
let mut s = String::from("Hello"); // String型
s.push_str(", world!");           // 変更可能

let slice: &str = &s;              // &str型(参照)
println!("{}", slice);

なぜ2つあるのか? それは、Rustの核心である「メモリ管理」を効率的に行うためです。すべてを String にするとメモリ消費が激しくなり、すべてを &str にすると柔軟性がなくなります。用途に応じて使い分けるのがRust流です。


まとめ:今回の学習ポイント

  • Option は「あるかないか」を管理。None を扱うことで「ぬるぽ」を撲滅!
  • Result は「成功か失敗か」を管理。エラーハンドリングを強制して安全性を高める。
  • Vec は要素数が変わるリストに使う。
  • String は持ち運び可能な文字列の実体、&str は効率的な「のぞき窓」。

これらをマスターすれば、Rustで実用的なプログラムを書く準備が整います。 特に String&str の使い分けは、最初は戸惑いますが、書き続けるうちに「メモリをどう扱っているか」が意識できるようになり、楽しくなってくるはずです!

コメント

タイトルとURLをコピーしました

Fatal error: Uncaught Error: Call to undefined function wp_parse_auth_cookie() in /home/c5994206/public_html/niyanmemo.com/wp-includes/user.php:3632 Stack trace: #0 /home/c5994206/public_html/niyanmemo.com/wp-content/plugins/microsoft-clarity/clarity-server-analytics.php(105): wp_get_session_token() #1 /home/c5994206/public_html/niyanmemo.com/wp-content/plugins/microsoft-clarity/clarity-server-analytics.php(35): clarity_construct_collect_event() #2 /home/c5994206/public_html/niyanmemo.com/wp-includes/class-wp-hook.php(341): clarity_collect_event() #3 /home/c5994206/public_html/niyanmemo.com/wp-includes/class-wp-hook.php(365): WP_Hook->apply_filters() #4 /home/c5994206/public_html/niyanmemo.com/wp-includes/plugin.php(522): WP_Hook->do_action() #5 /home/c5994206/public_html/niyanmemo.com/wp-includes/load.php(1308): do_action() #6 [internal function]: shutdown_action_hook() #7 {main} thrown in /home/c5994206/public_html/niyanmemo.com/wp-includes/user.php on line 3632