Rubyのブロック構文とyieldの使い方

Rubyにはブロック構文(ブロック付きメソッド)という構文があります。このブロック構文の使い方について説明します。

ブロック構文の例

ブロック構文は、eachメソッドなどで使われます。eachメソッドは、配列[1, 3, 7, 2, 5]の要素を1つずつ取り出し、do-endの記述された処理を実行します。
[1, 3, 7, 2, 5].each do |x|
  puts x
end
xは、取り出された要素が入る変数(ブロック引数)で、そのxについてdo-endまでのことを行ないます。このdo~endをブロック構文と言います。do-endを{ }に置き換えて、以下のように記述することもできます。  

[1, 3, 7, 2, 5].each do { |x| puts hensu }
do-end 、{ } いずれの形式でも構わないのですが、1行に収まるときは{ }、複数行になるときはdo endが好まれる傾向があります。

ブロック構文を使ったメソッドの作成

ブロック構文を使ったメソッドは、メソッドに渡されたブロックを実行するyieldを使うことで記述できます。
def block
    yield
end

block do
    puts "This is block";
end
また、yieldに引数を渡すことで、ブロック引数として使うことができます。以下では、"block"をブロック引数のnameに渡しています。
def block
    yield "block"
end

block do |name|
    puts "This is " + name;
end
実行結果
This is block

クラスでブロックつきメソッドを使う

また、クラスでもブロックつきメソッドを定義することはできます。以下は、簡易版のeachメソッドをSampleEachクラスに定義する例です。
class SampleEach
  #初期化時にインスタンス変数@arrayに配列を入れる
  def initialize(array)
    @array = array
  end

    #簡易版eachメソッド
  def each
    i = 0
    while i < @array.length
      #yieldでブロック引数に@array[i]を渡す
      yield @array[i]
      i += 1
    end
  end
end

instance = SampleEach.new([1,2,3,4,5])
instance.each do |x|
  puts x
end
実行結果
1
2
3
4
5

イベント