Rubyのproc
とlambda
についての学習記録
Rubyの開発で役立つproc
とlambda
について理解を深めるため、まずは基本となるブロックから学びました。この記事では、ブロック、proc
、そしてlambda
の使い方や違いについて整理し、コード例を交えて説明します。
ブロックとは
ブロックは、メソッドに渡す処理のまとまりを表します。以下の例では、do...end
の間にある部分がブロックです。
users = ["太郎", "花子"]
users.each do |user|
p "私の名前は" + user + "です"
end
do...endの代わりに{ }を使うこともできます。
users = ["太郎", "花子"]
users.each { |user| p "私の名前は" + user + "です" }
ブロックをメソッドの引数として渡すことで、繰り返し処理などを効率よく書けるようになります。このブロックをオブジェクトとして再利用できるようにしたものが、procやlambdaです。
方法1: Procクラスを使う
ブロックをオブジェクトに登録して、再利用可能にするには、Procクラスを使います。Procオブジェクトを作成するには、newメソッドでブロックを指定します。作成したオブジェクトは、callメソッドで実行できます。
Procクラスの基本
Proc
オブジェクトの定義
name = Proc.new do |f_name, l_name|
"私の名前は" + f_name + l_name + "です"
end
Proc
オブジェクトの呼び出し
introduction = name.call("山田", "太郎")
p introduction # => "私の名前は山田太郎です"
{}を使った定義も可能です。
name = Proc.new { |f_name, l_name| "私の名前は" + f_name + l_name + "です" }
p name.call("山田", "太郎") # => "私の名前は山田太郎です"
方法2: procメソッド
Procオブジェクトは、procメソッドを使って簡潔に定義することもできます。procメソッドは、Kernelクラスのメソッドであり、Proc.newの短縮形として利用されます。
name = proc do |f_name, l_name|
"私の名前は" + f_name + l_name + "です"
end
p name.call("山田", "太郎") # => "私の名前は山田太郎です"
{}での定義も可能です。
name = proc { |f_name, l_name| "私の名前は" + f_name + l_name + "です" }
p name.call("山田", "太郎") # => "私の名前は山田太郎です"
方法3: lambdaを使う
procに似た方法で、lambdaも使用できます。lambdaは、引数の扱いがprocとは少し異なり、引数の数が一致しない場合にエラーを出すなど、厳密な動作をします。
name = lambda do |f_name, l_name|
"私の名前は" + f_name + l_name + "です"
end
p name.call("山田", "太郎") # => "私の名前は山田太郎です"
方法4: アロー演算子 ->
lambdaはアロー演算子(->)で簡潔に記述できます。この場合、引数はブロックの前に()で指定します。
name = -> (f_name, l_name) do
"私の名前は" + f_name + l_name + "です"
end
p name.call("山田", "太郎") # => "私の名前は山田太郎です"
また、{}での定義も可能です。
name = -> (f_name, l_name) { "私の名前は" + f_name + l_name + "です" }
p name.call("山田", "太郎") # => "私の名前は山田太郎です"
procとlambdaの違い
引数の扱い: procは引数の数に柔軟ですが、lambdaは厳密です。例えば、lambdaでは引数が一致しないとエラーになります。
returnの動作: proc内でreturnを使うと、メソッド全体から抜けますが、lambdaではreturnが呼び出し元に戻ります。
まとめ
procとlambdaを使うことで、ブロックをオブジェクトとして管理し、コードの再利用性を高めることができます。これにより、より効率的でメンテナンス性の高いプログラムを作ることが可能です。