Rubyで無名関数の書き方
Rubyでは無名関数を作成するために、主にProcオブジェクトやlambdaを使用します。
無名関数とは、名前を持たない関数で、通常はコードの中で一時的に使われる関数です。
以下に、それぞれの方法について詳しく説明します。
Procオブジェクト
ProcはRubyのクラスで、コードブロックをオブジェクトとして扱います。
Procオブジェクトは、変数に代入したり、引数として渡したりすることができます。
Procオブジェクトを作成するには、Proc.newまたはprocメソッドを使います。
# Proc.new を使った例 my_proc = Proc.new do |x| puts "Hello, #{x}" end # proc メソッドを使った例 my_proc = proc do |x| puts "Hello, #{x}" end my_proc.call("World") # 出力: Hello, World
Procオブジェクトは引数の数に柔軟性があります。
引数の数が一致しない場合、nilで補完されますが、エラーが発生するわけではありません。
lambda
lambdaはProcオブジェクトの一種ですが、いくつかの重要な違いがあります。
特に、引数の数が一致しないとエラーが発生し、return文がlambda内で呼ばれると、そのlambdaからだけでなく、lambdaを呼び出したメソッドからも戻ります。
# lambda を使った例 my_lambda = lambda do |x| puts "Hello, #{x}" end # lambda を使って引数を指定しない場合、エラーが発生します # my_lambda.call # ArgumentError: wrong number of arguments (given 0, expected 1) my_lambda.call("World") # 出力: Hello, World # lambda 内の return 文は lambda のみを抜けます def test_lambda my_lambda = lambda do return "Returning from lambda" end my_lambda.call "Not returning from lambda" end puts test_lambda # 出力: Not returning from lambda
匿名関数の使い方
無名関数は、ブロックとして使用することもできます。
特に、Enumerableモジュールのメソッド(map, select, each など)は、ブロックを引数に取ります。
これにより、無名関数を簡単に使用することができます。
# 各要素に対して無名関数を適用 [1, 2, 3].each do |num| puts num * 2 end # map メソッドを使用して無名関数で変換 doubled = [1, 2, 3].map { |num| num * 2 } puts doubled.inspect # 出力: [2, 4, 6]
まとめ
Rubyでは無名関数をProcオブジェクトやlambdaで表現することができます。
Procオブジェクトは引数の数に対して柔軟ですが、lambdaは引数の数に厳密であり、return文の動作が異なります。
どちらを使用するかは、目的や必要な動作によって選ぶことができます。
また、ブロックを使うことで、より簡潔に無名関数を利用することもできます。