ブロックとProcについて
ブロックとは、{}やdo〜endで表す引数の塊のことです。
ブロックの使い方
ブロックはyieldとともに使います。
def func(a) a + yield end p func(1){2} #3
上のようにyieldはブロックの引数を受け取っています。
def func(a) a + yield end b = 3 p func(1){b =+5} #⇒9 p b #⇒8
ブロックでは、ブロックの外側で指定された変数を取得したり更新したりできます(クロージャという)。
Procの使い方
ブロックをオブジェクトとして扱いたい時にProcを使います。Procを呼び出す際にはcallメソッドを使います。また、「&」を使うとyieldを使わない書き方も可能です
proc = Proc.new{|x| p x } proc.call(1) #1 def func1(a) a + yield end proc1 = Proc.new{2} func1(1,&proc). #=>3 def func2(&block) block.call end func2{"hello"} #=>"hello"
Procと似ているものにlambdaメソッドというものがあります。 大きな違いは、
1.returnメソッドの振る舞いが、Procはメソッドを終了するが、lambdaは呼び出し元に復帰する
2.引数の指定が、lambdaの方が厳しい
などがあります。