アウトプットの部屋

エンジニアになるためのアウトプット

ブロックと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の方が厳しい

などがあります。