Rust

【Rust】第2章第5回:クロージャ(Closure)の使い方と応用

本記事では、Rustのクロージャ(Closure)の基本的な使い方と応用について詳しく解説します。クロージャを活用することで、柔軟でコンパクトなコードを書くことが可能になります。

0. 記事の概要

この記事を読むメリット

  • Rustのクロージャの基本を理解: 関数とクロージャの違いを学べます。
  • 柔軟なコードを書く: クロージャを活用することで、より短く簡潔な処理を実装できます。
  • Rustの所有権との関係を学ぶ: クロージャが変数をキャプチャする仕組みを理解できます。

この記事で学べること

  • Rustのクロージャの基本構文
  • クロージャのキャプチャと所有権
  • クロージャを使った応用例

1. クロージャとは?

1.1 クロージャの基本構文

クロージャは、変数をキャプチャできる匿名関数です。

fn main() {
    let add = |x, y| x + y;
    println!("5 + 3 = {}", add(5, 3));
}

動作解説

このコードでは、|x, y| x + y というクロージャを定義し、それを使って足し算を行っています。

2. クロージャのキャプチャ

2.1 変数をキャプチャするクロージャ

クロージャは、スコープ内の変数をキャプチャすることができます。

fn main() {
    let num = 10;
    let multiply = |x| x * num;
    println!("3 × {} = {}", num, multiply(3));
}

動作解説

このクロージャは、スコープ内の変数numをキャプチャし、掛け算を行います。

3. クロージャの所有権

3.1 moveを使った所有権の移動

クロージャが変数の所有権を取得するにはmoveを使用します。

fn main() {
    let text = String::from("Hello");
    let say_hello = move || println!("{}", text);
    say_hello();
}

動作解説

moveを指定することで、変数textの所有権がクロージャに移動します。

4. よくあるエラーと対処法

  • 「borrowed value does not live long enough」エラー: クロージャのスコープ外で変数が参照される場合に発生。所有権を明示的に移動する。
  • 「cannot borrow as mutable」エラー: 可変参照を使用する場合は、move&mutを適切に指定する。

5. まとめ

本記事では、Rustのクロージャの基本、変数のキャプチャ、所有権の移動について解説しました。次回は、Rustの所有権システムについて詳しく学びます。