Ruby練習問題4-6:ラムダ(Lambda)を理解しよう

記事内に商品プロモーションを含む場合があります

Rubyの初心者向け問題4-6:ラムダ(Lambda)を理解しよう

この問題を解くために必要な知識:
【レベル1~3の知識】
コメントの書き方、変数と定数、基本データ型、四則演算と演算子、入力と出力、文字列操作、分岐処理(if、if~else、elsif、case)、繰り返し処理(for、while、until、each)、範囲(Range)、例外処理(begin-rescue-end)、配列(Array)、ハッシュ(Hash)、コレクション操作(配列、ハッシュの操作)、Enumerableモジュール、メソッドの定義と呼び出し、メソッドの戻り値、クラスの定義と使用、コンストラクタ、クラスの継承、モジュールの定義と使用、ミックスイン

【レベル4の知識】
アクセスメソッド(ゲッター、セッター)カプセル化クラスメソッドとインスタンスメソッド共通メソッド、ブロックとイテレータ、プロック(Proc)、ラムダ(Lambda)、ファイル操作(読み書き)正規表現メタプログラミングの基礎

<<前の問題 問題集Top 次の問題>

Rubyの文法「ラムダ」とは

ここではラムダの意味や使い方を復習します。必要ない方はここをクリックして練習問題へ飛びましょう。



Rubyのラムダは、無名関数と呼ばれるものです。無名関数とは、名前を持たずに定義される関数のことです。

Rubyでは、メソッドに似た動作をするコードブロックをラムダとして定義できます。これは、必要に応じて呼び出すことができ、特定の処理を簡潔にまとめたい場合に便利です。

ラムダは次のように定義します。

# ラムダの定義
my_lambda = lambda { |引数| 処理 }

例えば、2倍にするラムダを定義して呼び出す場合、次のように書きます。

doubler = lambda { |n| n * 2 }
puts doubler.call(5) # 結果: 10
  • lambda はラムダを定義するためのキーワードです。
  • { |n| n * 2 } は、ブロックの中に n という引数を取り、n に2を掛けた値を返すという処理を表しています。
  • call(5) で、ラムダを実行し、引数 5 を渡しています。結果は10です。

ラムダとブロックの違い

ラムダは、Rubyのブロックと似ていますが、いくつかの違いがあります。

  1. 引数の扱い: ラムダは、引数の数が正確に一致していなければエラーになりますが、ブロックは不足している引数を無視することがあります。
  2. return の動作: ラムダ内で return を使うと、そのラムダだけから抜けますが、ブロック内で return を使うと、そのブロックを含むメソッド全体から抜けます。

ラムダを使うべきケース

ラムダは、メソッドの中で短い処理を動的に定義したい場合や、複数の関数を変数として扱いたい場合に非常に役立ちます。また、コードの再利用性を高め、柔軟な設計を実現するために使用されます。

ラムダを使うことで、より洗練されたコードを簡潔に書けるようになりますので、ぜひ活用してみてください! ​




Ruby練習問題ラムダ(Lambda)を使って配列のフィルタリングをしよう

配列の要素をラムダ(Lambda)を使ってフィルタリングするプログラムを作成しましょう。

このプログラムでは、整数の配列を受け取り、指定された条件に基づいて要素をフィルタリングして新しい配列を生成します。

ラムダは、2つの異なる条件を持つものを作成してください。1つは要素が偶数かどうかを判定する条件、もう1つは要素が3の倍数かどうかを判定する条件です。

この問題の要件

以下の要件に従ってコードを完成させてください。

  • numbersという配列に、1から10までの整数を格納すること。
  • even_lambdaというラムダを定義し、このラムダは要素が偶数かどうかを判定すること。
  • multiple_of_three_lambdaというラムダを定義し、このラムダは要素が3の倍数かどうかを判定すること。
  • filter_arrayというメソッドを定義し、このメソッドは配列とラムダを引数に取り、ラムダを適用して条件を満たす要素だけを含む新しい配列を返すこと。
  • filter_arrayメソッドを使って、numbers配列の要素をeven_lambdamultiple_of_three_lambdaでそれぞれフィルタリングした結果を表示すること。

ただし、以下のような実行結果となること。

----- ↓出力される結果の例↓ -----

Even numbers: [2, 4, 6, 8, 10]
Multiple of three numbers: [3, 6, 9]

----- ↑出力される結果の例↑ -----

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1.配列の定義
 1-1. numbers = (1..10).to_a による範囲オブジェクト (1..10) を配列に変換し、numbers に代入

2.ラムダの定義
 2-1. even_lambda = ->(n) { n.even? } による、要素が偶数かどうかを判定するラムダ関数を定義
 2-2. multiple_of_three_lambda = ->(n) { n % 3 == 0 } による、要素が3の倍数かどうかを判定するラムダ関数を定義

3.配列をフィルタリングするメソッドの定義
 3-1. filter_array(array, lambda) メソッドの定義
  3-1-1. select メソッドを用いて、配列の要素にラムダ関数を適用し、条件を満たす要素を選択

4.フィルタリングの実行と結果の出力
 4-1. filter_array(numbers, even_lambda) を用いて、numbers 配列の要素を even_lambda でフィルタリングし、結果を even_numbers に代入
 4-2. puts "Even numbers: #{even_numbers}" で偶数の要素を出力
 4-3. filter_array(numbers, multiple_of_three_lambda) を用いて、numbers 配列の要素を multiple_of_three_lambda でフィルタリングし、結果を multiple_of_three_numbers に代入
 4-4. puts "Multiple of three numbers: #{multiple_of_three_numbers}" で3の倍数の要素を出力

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

# 配列の定義
numbers = (1..10).to_a

# 要素が偶数かどうかを判定するラムダの定義
even_lambda = ->(n) { n.even? }

# 要素が3の倍数かどうかを判定するラムダの定義
multiple_of_three_lambda = ->(n) { n % 3 == 0 }

# 配列をフィルタリングするメソッドの定義
def filter_array(array, lambda)
=begin
  【穴埋め問題1】
  ここで新しい配列を作成し、各要素にラムダを適用して
  条件を満たす要素を選択してください。
=end
end

# `numbers`配列の要素を`even_lambda`でフィルタリングした結果を表示
even_numbers = filter_array(numbers, even_lambda)
=begin
  【穴埋め問題2】
  ここでフィルタリング結果を表示するために、putsを使用して
  偶数の要素を出力してください。
=end

# `numbers`配列の要素を`multiple_of_three_lambda`でフィルタリングした結果を表示
multiple_of_three_numbers = filter_array(numbers, multiple_of_three_lambda)
=begin
  【穴埋め問題3】
  ここでフィルタリング結果を表示するために、putsを使用して
  3の倍数の要素を出力してください。
=end

 

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。



解答例と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

********************

# 配列の定義
numbers = (1..10).to_a

# 要素が偶数かどうかを判定するラムダの定義
even_lambda = ->(n) { n.even? }

# 要素が3の倍数かどうかを判定するラムダの定義
multiple_of_three_lambda = ->(n) { n % 3 == 0 }

# 配列をフィルタリングするメソッドの定義
def filter_array(array, lambda)
  # 新しい配列を作成し、各要素にラムダを適用して条件を満たす要素を選択する
  array.select(&lambda)
end

# `numbers`配列の要素を`even_lambda`でフィルタリングした結果を表示
even_numbers = filter_array(numbers, even_lambda)
puts "Even numbers: #{even_numbers}"

# `numbers`配列の要素を`multiple_of_three_lambda`でフィルタリングした結果を表示
multiple_of_three_numbers = filter_array(numbers, multiple_of_three_lambda)
puts "Multiple of three numbers: #{multiple_of_three_numbers}"

********************

コードの解説

このRubyコードでは、ラムダの使い方に焦点を当てて、配列の要素をフィルタリングする方法を学びます。各部分の説明は次の通りです。

配列の定義

numbers = (1..10).to_a

このコードでは、1から10までの整数範囲を配列に変換し、numbersに格納します。

ラムダの定義

even_lambda = ->(n) { n.even? }
multiple_of_three_lambda = ->(n) { n % 3 == 0 }

ラムダとは、名前を持たない関数のことです。ここでは、even_lambdaは偶数かどうかを判定し、multiple_of_three_lambdaは3の倍数かどうかを判定します。

->(n) という記法を使ってラムダを定義し、nを引数として受け取ります。

配列のフィルタリング

def filter_array(array, lambda)
  array.select(&lambda)
end

この関数は、配列の各要素にラムダを適用し、条件を満たす要素だけを選び出します。&lambdaはラムダをブロックとして扱う記法です。

フィルタリングの実行と結果表示

even_numbers = filter_array(numbers, even_lambda)
puts "Even numbers: #{even_numbers}"

multiple_of_three_numbers = filter_array(numbers, multiple_of_three_lambda)
puts "Multiple of three numbers: #{multiple_of_three_numbers}"

この部分では、numbers配列をそれぞれのラムダでフィルタリングし、結果を表示します。

<<前の問題 問題集Top 次の問題>

この問題への質問・コメント

この問題を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Ruby練習問題集へ戻る
    トップページへ戻る