Menu
Coddy logo textTech

環境のキャプチャ

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です
challenge icon

チャレンジ

簡単

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);
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Logic & Flowのすべてのレッスン