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?

Rubyの`proc`と`lambda`についての学習記録

Posted at

Rubyのproclambdaについての学習記録

Rubyの開発で役立つproclambdaについて理解を深めるため、まずは基本となるブロックから学びました。この記事では、ブロック、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を使うことで、ブロックをオブジェクトとして管理し、コードの再利用性を高めることができます。これにより、より効率的でメンテナンス性の高いプログラムを作ることが可能です。

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?