環境のキャプチャ
CoddyのRustジャーニー「Logic & Flow」セクションの一部 — レッスン 62/66。
クロージャの最も強力な機能の1つは、周囲の環境から変数をキャプチャして利用できる能力です。通常の関数とは異なり、クロージャは自身が定義されたのと同じスコープ内に存在する変数を「参照」し、アクセスすることができます。
環境キャプチャの仕組みは以下の通りです:
fn main() {
let x = 10;
let my_closure = || {
println!("The value of x is: {}", x);
};
my_closure(); // これは "The value of x is: 10" と出力します
}この例では、クロージャは周囲のスコープから変数 x をキャプチャし、それを自身の内部で使用します。クロージャは x を引数として渡される必要はなく、自動的にアクセスすることができます。
変数をキャプチャして計算に使用することもできます:
let multiplier = 3;
let multiply_by_three = |num| num * multiplier;
let result = multiply_by_three(5); // 結果は15ですチャレンジ
簡単2つの入力を受け取ります。最初の入力は基本価格を表す数値です。2番目の入力は割引率を表す数値です。環境から割引率をキャプチャし、割引適用後の最終価格を計算するクロージャを作成してください。そのクロージャを基本価格で呼び出し、最終価格を出力してください。
要件:
- 最初の入力(基本価格)を読み込み、空白をトリムする
- それを
f64にパースする - 2番目の入力(割引率)を読み込み、空白をトリムする
- それを
f64にパースする - 1つのパラメータ(基本価格)を受け取り、周囲の環境から割引率をキャプチャするクロージャを作成する
- クロージャは次の式を使用して最終価格を計算する必要があります:
base_price - (base_price * discount / 100.0) - 基本価格を引数にしてクロージャを呼び出す
- 最終価格を出力する
入力:
- 1行目: 基本価格 (例:
100.0) - 2行目: 割引率 (例:
20.0)
出力:
- 割引適用後の最終価格
チートシート
クロージャは、引数として必要とすることなく、周囲の環境から変数をキャプチャして使用することができます。
基本的な環境のキャプチャ:
let x = 10;
let my_closure = || {
println!("The value of x is: {}", x);
};
my_closure(); // "The value of x is: 10" と出力されます計算における変数のキャプチャ:
let multiplier = 3;
let multiply_by_three = |num| num * multiplier;
let result = multiply_by_three(5); // result は 15 ですクロージャは周囲のスコープから multiplier を自動的にキャプチャし、計算に使用します。
自分で試してみよう
use std::io;
fn main() {
// 基本価格を読み込む
let mut base_price_input = String::new();
io::stdin().read_line(&mut base_price_input).expect("Failed to read line");
let base_price: f64 = base_price_input.trim().parse().expect("Invalid number");
// 割引率を読み込む
let mut discount_input = String::new();
io::stdin().read_line(&mut discount_input).expect("Failed to read line");
let discount: f64 = discount_input.trim().parse().expect("Invalid number");
// TODO: 割引率をキャプチャして最終価格を計算するクロージャを作成する
// TODO: 基本価格を引数にしてクロージャを呼び出す
// 最終価格を表示する
// println!("{}", final_price);
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。