Rust クロージャとは 使い方と注意点
Rustのクロージャは、匿名関数とも呼ばれ、他の関数と同様に振る舞いつつ、外部スコープの変数をキャプチャできる構造です。
クロージャを使うと、関数を柔軟に定義でき、関数型プログラミングの要素を取り入れたコードを書けます。
クロージャの使い方
基本的なクロージャ
クロージャは|...|(パイプ記号)を使って引数を定義し、その後にブロックを続けてコードを実行します。
let add_one = |x: i32| x + 1;
println!("{}", add_one(5));
匿名関数add_oneを定義し、引数xに1を加算する操作を行っています。add_oneは、通常の関数と同様に呼び出せます。
外部変数のキャプチャ
クロージャは外部スコープの変数をキャプチャして使用できます。
キャプチャの仕方は、借用、可変借用、所有権の取得の3種類があります。
let factor = 2;
let multiply = |x: i32| x * factor;
println!("{}", multiply(5));
クロージャが外部スコープの変数factorをキャプチャし、それを使って演算を行っています。
高階関数でのクロージャ
クロージャは、高階関数の引数として使用できます。
fn apply_twice<F>(f: F, x: i32) -> i32
where
F: Fn(i32) -> i32,
{
f(f(x))
}
let add_two = |x| x + 2;
println!("{}", apply_twice(add_two, 5));
apply_twiceという高階関数にクロージャadd_twoを渡し、2回適用しています。
Rustの案件を探すならクラウドワークス テック
クロージャの注意点
キャプチャの方法
クロージャのキャプチャには借用、可変借用、所有権の取得の3種類があります。
クロージャがどのように変数をキャプチャするかによって、クロージャの型が変わることがあります。Fnは不変借用、FnMutは可変借用、FnOnceは所有権の取得を示します。
ライフタイムと所有権
クロージャが外部変数をキャプチャする際、変数のライフタイムと所有権に注意が必要です。
キャプチャした変数のスコープが終了すると、クロージャの動作に影響を与える可能性があります。
パフォーマンスへの影響
クロージャのキャプチャは、場合によってはメモリのオーバーヘッドやパフォーマンスへの影響をもたらすことがあります。
特に、キャプチャする変数が多い場合、メモリ消費に注意します。
Rustをもっと詳しくなりたい方に
Rustプログラミング完全ガイド 他言語との比較で違いが分かる!
個人的には他の言語開発もそれなりにあったことからこの本を読むことでかなりRustへの理解が深まりました。
プログラムやシステム的な専門用語は当たり前に登場するものの、他の言語での開発経験がある方なら問題ないでしょう。むしろその経験があることで、多言語との比較をしながら読み進めることができます。
内容的には大容量かつ丁寧すぎるほど嚙み砕いて説明がされているため、情報量は十分といえます。Rust自体学習コストが高く、難易度の高い言語のためこのくらいが妥当といえます。
プログラミング初心者レベルの方には難しい内容となっていますが、Rustの概念を理解し、基礎を把握することができる本であること間違いなしです。
Rust学習のために筆者が実際に読んでおすすめしたい本をまとめています。
基礎から学ぶRustプログラミング入門
本コースではRustについて全く経験がない方でもスムーズに学習を進められるようにとなっています。
基本的にはコードベースで解説を行い、抽象度が高く難しい内容に関しては適宜スライドも使いながら丁寧に解説します。そしてただ文法を学ぶだけではなく、最終的には演習としてCLIアプリケーションを作成し学習内容の定着を図ります。
以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。