Rubyで無名関数の書き方

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文の動作が異なります。
どちらを使用するかは、目的や必要な動作によって選ぶことができます。
また、ブロックを使うことで、より簡潔に無名関数を利用することもできます。