Rubyのブロック、Proc、そしてlambdaについて調べてみた
背景
Rubyにおけるブロックはほぼ無意識に使っているのですが、
流石にそろそろLambda何かについても学ぼうかな、と思い、ブロック、Proc、lambdaについて
調べてみた記録です。
同じような説明はすでにQiita内にも溢れていますが、自分の理解を言葉にしてoutputするのも大事だと思っているので作成しました。
ブロック
ブロックとは?
メソッドに対する引数として、値ではなくコードブロックを渡すことができるもの。
do |i| ~ end
もしくは { |i| ~ }
と表記する。
複数行に渡って記述する場合はdo ~ end
、1行で記述する場合は{ ~ }
を使うことが多い。
なお、i
はブロック変数で、ブロック内でしか使用できない変数(ブロック内でスコープが閉じている)
以下はArray#eachメソッドの例
hoge = [1,2,3,4,5]
hoge.each do |fuga|
p fuga
end
ブロックはメソッドの引数として1つしか与えることができない。
(というより言語仕様としてdo~end
を連続して記述できないといったほうが正しいかも)
Proc
Procとは?
一言で言うと、ブロックをオブジェクト化したもの
Proc.new
の引数にブロックを渡すことで、そのブロックをオブジェクト化できる。
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はこう使うとこういう時嬉しいよ!等ありましたら是非お願いします。
Author And Source
この問題について(Rubyのブロック、Proc、そしてlambdaについて調べてみた), 我々は、より多くの情報をここで見つけました https://qiita.com/ex_SOUL/items/b523f71d1cf97352f266著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .