コールバックとしてのブロック
「コールバックとしてのブロック」として知られる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を使う方法がある。
以上。