Rubyのブロックを学ぶ
ブロックはプログラムのかたまり
メソッドにブロックを渡すことができる
ブロック付きメソッド呼び出し
ブロックが渡されたどうかをif文で判断するなどして、処理を切り替えることができる
メソッドの中で、Kernel.#block_given?を使って、ブロック渡されたか (メソッドがブロック付きで呼び出されたか) を判別できる
メソッドの中で、yieldを使って、渡されたブロックを実行できる
ブロックをProcオブジェクトとして渡すこともできる
変数の先頭に&をつけて (Procオブジェクトを生成して) 渡す
&をつける以外にも、Procオブジェクトを生成する方法がいくつかある
Proc.newまたはKernel.#procでProcオブジェクトを生成する
Kernel.#lambda (lambda {|a, b| p [a, b] }) またはlambdaの省略記法 (->(a,b){ p [a,b] }) でProcオブジェクトを生成する
lambdaの省略記法はラムダリテラルや、アロー演算子とも呼ばれる
lambdaを使った場合は、Proc.newやprocと違って、ブロック引数の数とブロックに渡す引数の数が一致していないとエラーになるなどの厳密さがある
Procオブジェクトを渡されたメソッドの中で、Proc#callを使ってブロックを実行できる
引数で渡されたブロックを格納する変数がnilかどうか (変数.nil?) で、ブロックが渡されたかを判別できる
オブジェクトとして受け取ることで、受け取ったブロックをさらに別のメソッドに渡すことができる
オブジェクトとして受け取ることで、Proc#arityなどのブロックを扱うメソッドを利用できる
関連URL
手続きオブジェクトの挙動の詳細
Rubyスタイルガイドを読む: 文法(7)lambda、標準入出力など|TechRacho by BPS株式会社
rubyのブロックとProcに本質的な違いはありますか? - Quora
#ゼロからわかる_Ruby_超入門
#プロを目指す人のためのRuby入門
#Rubyを学ぶ