0Pricing
Learn Rust Coding · レッスン

クロージャ

匿名関数

「クロージャ」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。

クロージャとは

クロージャは、変数に保存して後から呼び出せる無名関数です。パラメーターを縦棒で囲んで記述します。

fn main() {
    let add_one = |x| x + 1;
    println!("{}", add_one(4));
}

クロージャの構文

パラメーターを|...|の間に記述し、その後に本体を続けます。式が1つだけの場合は、波かっこは必要ありません。

  • |x| x + 1 — パラメーターが1つです。
  • |a, b| a + b — パラメーターが2つです。
fn main() {
    let multiply = |a, b| a * b;
    println!("{}", multiply(3, 5));
}

複数行のクロージャ

複数の文を記述する場合は、関数と同じように本体を波かっこで囲みます。

fn main() {
    let describe = |n: i32| {
        let doubled = n * 2;
        println!("{} doubled is {}", n, doubled);
    };
    describe(7);
}

環境のキャプチャ

通常の関数とは異なり、クロージャは周囲のスコープにある変数をキャプチャして、内部で使用できます。

fn main() {
    let factor = 10;
    let scale = |x| x * factor;
    println!("{}", scale(5));
}

クロージャの型推論

クロージャは通常、使われ方からパラメーターと戻り値の型を推論するため、型注釈は省略できます。

必要に応じて、わかりやすさのために型を追加することもできます。

fn main() {
    let greet = |name: &str| -> String {
        format!("Hello, {}!", name)
    };
    println!("{}", greet("Rust"));
}

引数としてのクロージャ

多くの標準メソッドはクロージャを受け取ります。たとえばmapは各要素にクロージャを適用します。

fn main() {
    let nums = vec![1, 2, 3];
    let doubled: Vec<i32> = nums.iter().map(|x| x * 2).collect();
    println!("{:?}", doubled);
}

クロージャによるフィルタリング

filterメソッドは、クロージャがtrueを返す要素だけを残します。

fn main() {
    let nums = vec![1, 2, 3, 4, 5, 6];
    let evens: Vec<i32> = nums.into_iter().filter(|x| x % 2 == 0).collect();
    println!("{:?}", evens);
}

クロージャの格納

クロージャには固有の匿名型がありますが、変数に格納して再利用できます。

fn main() {
    let is_even = |n: i32| n % 2 == 0;
    println!("{} {}", is_even(4), is_even(7));
}

クロージャと関数の違い

違い:

  • 関数は周囲の変数をキャプチャできませんが、クロージャはできます。
  • クロージャは匿名で、多くの場合短く記述されます。
  • クロージャの型は通常推論されます。
fn main() {
    let base = 100;
    let bonus = |earned: i32| earned + base;
    println!("{}", bonus(25));
}

計算結果を返す

クロージャとイテレーターを組み合わせると、すっきりと表現力の高いパイプラインで結果を計算できます。

fn main() {
    let nums = vec![10, 20, 30];
    let total: i32 = nums.iter().map(|x| x + 1).sum();
    println!("total {}", total);
}

クロージャによる参照キャプチャ

デフォルトでは、クロージャはキャプチャした変数を借用します(借用のみの場合は、後で外側から読み取ることもできます)。

fn main() {
    let name = String::from("Ada");
    let printer = || println!("Name: {}", name);
    printer();
    println!("still usable: {}", name);
}

クイックチェック

クロージャの重要な機能を思い出しましょう。

まとめ

Rustのクロージャ:

  • |params| bodyと記述する匿名関数です。
  • 環境にある変数をキャプチャできます。
  • 型は通常推論されます。
  • mapやfilterなどのイテレーターメソッドで広く使われます。
fn main() {
    let tax = 0.2;
    let with_tax = |price: f64| price * (1.0 + tax);
    println!("{}", with_tax(50.0));
}

よくある質問

「クロージャ」レッスンは無料ですか?

はい。「クロージャ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。

「クロージャ」で何を学びますか?

匿名関数 ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Learn Rust Codingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「クロージャ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLearn Rust Codingレッスンでコードを書いて実行できますか?

はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 関数の定義
  2. 式と文
  3. クロージャ
  4. Fn、FnMut、FnOnce
← Learn Rust Codingに戻る