Rubyのブロック、Proc、そしてlambdaについて調べてみた


背景

Rubyにおけるブロックはほぼ無意識に使っているのですが、
流石にそろそろLambda何かについても学ぼうかな、と思い、ブロック、Proc、lambdaについて
調べてみた記録です。
同じような説明はすでにQiita内にも溢れていますが、自分の理解を言葉にしてoutputするのも大事だと思っているので作成しました。

ブロック

ブロックとは?

メソッドに対する引数として、値ではなくコードブロックを渡すことができるもの
do |i| ~ end もしくは { |i| ~ }と表記する。
複数行に渡って記述する場合はdo ~ end、1行で記述する場合は{ ~ }を使うことが多い。
なお、iはブロック変数で、ブロック内でしか使用できない変数(ブロック内でスコープが閉じている)

以下はArray#eachメソッドの例

each.rb
hoge = [1,2,3,4,5]
hoge.each do |fuga|
  p fuga
end

ブロックはメソッドの引数として1つしか与えることができない
(というより言語仕様としてdo~endを連続して記述できないといったほうが正しいかも)

Proc

Procとは?

一言で言うと、ブロックをオブジェクト化したもの
Proc.newの引数にブロックを渡すことで、そのブロックをオブジェクト化できる。

proc.rb
proc_block = Proc.new { |i| p i }

なので、前述のeachは以下のようにも記述できる(けど普通はこの書き方はしない)

hoge = [1,2,3,4,5]
proc = Proc.new { |i| p i }
## Procオブジェクトを引数として渡す場合は先頭に&を記載する
hoge.each &proc

Q: なんでProcオブジェクトをメソッドの引数として渡す時、先頭に&をつけるの?
A: (言語)仕様です。

リファレンス
https://docs.ruby-lang.org/ja/latest/class/Proc.html

Lambda

Lambdaとは?

ここがまだよく理解できていない。
イメージとしてはJavascriptの無名関数に近い。

Procオブジェクトと似たような働きをするけど、色々違うところがあるらしい。

この記事が参考になるよ!、Lambdaはこう使うとこういう時嬉しいよ!等ありましたら是非お願いします。