0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ChatGPT を使って、Rust言語を勉強します。クロージャ 篇

Posted at

質問1: Rust言語のクロージャを教えてください。

回答1:


Rust言語のクロージャとは、関数のように扱えるオブジェクトであり、関数と同様にパラメータを受け取り、値を返すことができます。しかし、クロージャは、定義されたスコープ内の変数をキャプチャして、その変数を使用して計算することができます。

Rust言語のクロージャは、次のように定義することができます。

let add = |x, y| x + y;

この例では、add というクロージャを定義しています。クロージャは、| で始まり、| で終わります。|x, y| は、クロージャが受け取る引数を定義しています。この例では、2つの引数 x と y を受け取ります。x + y は、クロージャが返す値を定義しています。

クロージャを実行するには、関数と同様に、以下のように呼び出します。

let result = add(3, 4);
println!("The result is {}", result); // The result is 7

この例では、add クロージャに引数 3 と 4 を渡し、7 という結果を得ています。

クロージャは、定義されたスコープ内の変数をキャプチャできます。キャプチャされた変数は、クロージャ内で使用することができます。

let x = 10;
let add_x = |y| x + y;
let result = add_x(5);
println!("The result is {}", result); // The result is 15

この例では、x という変数を定義しています。その後、add_x というクロージャを定義し、x をキャプチャしています。add_x は、引数 y を受け取り、x と y の和を返します。result には、add_x クロージャに引数 5 を渡した結果が格納されます。result の値は、15 となります。


質問2: Rust言語のクロージャの使い方を教えてください。

回答2:


Rust言語におけるクロージャは、関数を定義するための一種の構文であり、変数のスコープをキャプチャし、後で実行するための関数のようなものです。

以下は、Rust言語でクロージャを定義し、実行する例です。

fn main() {
    let add = |x, y| x + y;
    let result = add(3, 5);
    println!("{}", result);
}

この例では、addという名前のクロージャが定義されています。|x, y| x + yの部分がクロージャの本体であり、2つの引数xとyを受け取り、それらを加算した結果を返します。次に、addが呼び出され、引数として3と5が渡されます。最後に、println!マクロを使って、計算結果である8が出力されます。

また、クロージャは変数のスコープをキャプチャすることができます。以下は、クロージャが外部の変数をキャプチャする例です。

fn main() {
    let mut x = 5;
    {
        let add = || x += 1;
        add();
    }
    println!("{}", x);
}

この例では、addという名前のクロージャが定義されています。本体は、x += 1であり、xの値を1増やすことを意味します。次に、addが呼び出され、xの値が1増やされます。最後に、println!マクロを使って、変数xの値が出力されます。結果は6になります。

この例では、addクロージャが外部の変数xをキャプチャしています。このように、クロージャは外部のスコープの変数をキャプチャすることができます。


質問3: Rust言語のプリミティブ型を教えてください。

回答3:


以下は、Rust言語のクロージャを使った簡単な例です。この例は、与えられたベクターの値を2倍にして新しいベクターを作成するものです。

fn main() {
    let original_vector = vec![1, 2, 3, 4, 5];
    
    let new_vector: Vec<i32> = original_vector
        .iter()
        .map(|x| x * 2)  // クロージャを使って要素を2倍にする
        .collect();  // 新しいベクターを作成する
    
    println!("Original vector: {:?}", original_vector);
    println!("New vector: {:?}", new_vector);
}

この例では、.map()メソッド内でクロージャを定義して、各要素を2倍にしています。このクロージャは、短いラムダ式|x| x * 2で表されています。.collect()メソッドは、イテレータから新しいベクターを作成します。最後に、元のベクターと新しいベクターを印刷しています。


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?