クロージャ
匿名関数
「クロージャ」は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フィードバックを取得できます。ローカル設定は不要です。