Rubyのブロックについて

繰り返しメソッドのブロック

ブロックは{ }もしくはdo...endで囲まれた引数のこと。 よく使ってきたのはtimesとかeachとかforメソッドのブロック。

["red","blue","green"].each { |color| puts color }
red
blue
green

eachメソッドはオブジェクトのすべての要素に対してブロックを実行する。ブロックには各要素が順番に入り、結果を返す。

繰り返しメソッド以外のブロック

ブロックはすべてのメソッドに与えることができるらしい。確認してみる。

def hello
  p block_given?
  puts "hello"
end

hello
puts"-------------------------------------"
hello{return "here"}
false
hello
-------------------------------------
true
hello

block_given?はブロックが渡されているかをtrueかfalseで返す。 ブロックを渡した2つ目のhelloメソッドにはブロックが渡されていることがわかる。

実際にブロックを呼び出すにはyieldを使う。yieldは入れ替わるみたいな意味。

def hello
  p block_given?
  yield
  puts "hello"
end

hello{puts "here"}
true
here
hello

ブロックが呼び出されているのがわかる。