コールバックとしてのブロック

「コールバックとしてのブロック」として知られるRubyのコーディングテクニックがある。

使い方

ブロックを付けたメソッド呼び出し。

f.foo { |i,j|
  puts i, j
}

{}で囲まれている部分がブロック。
do...endでも書けるけど、こっちのほうがC/C++,Javaなどのプログラマーには最初は見やすいかな。

  • ブロックとは

ブロックとは要は無名関数の様なもの。
イメージ的にはこんな感じ。javascriptっぽいなぁ。

  f.foo(function(i,j) { puts(i, j);})
  • C/C++のコールバック

C/C++だと、コールバックされる関数を定義しなくちゃいけない。

void callback(i, j) {
  cout << i << j << endl;
}

f.foo(callback)

イテレータの作り方

イテレータと名前がついているが、これは過去の経緯が残ってしまっただけ。
Rubyでいうイテレータとは与えられたブロックを呼び出すメッソッドのことです。
C/C++で言えば、関数ポインタを引数に持った関数、と考えればいい。

void foo(PFUNC pfunc)
{
  i = j = 0;
  pfunc(i, j);
}

Rubyの場合、yeildがpfuncにあたる。

class Foo
  def foo
      yield "hello", "world"
  end
end

f = Foo.new
  • 実行結果

yeildの引数がブロックに渡され、実行される。

hello
world

他にもProc.newを使う方法がある。
以上。