LoginSignup
0
0

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-10-20

背景

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はこう使うとこういう時嬉しいよ!等ありましたら是非お願いします。

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