メモ from まつもと直伝 プログラミングのオキテ

まつもと直伝 プログラミングのオキテ 第5回(2) | 日経 xTECH(クロステック)より

内部イテレータクロージャの必要性

内部イテレータは余分なクラスを作らず,使うのも作るのも簡単です。しかし,言語がクロージャをサポートしていないとループ本体と外側とで情報を共有するために工夫が必要になり,C言語の例で見たようにループとしての使い勝手が悪くなります。
このため,クロージャを持たないC++Javaでは外部イテレータが採用されているのです。

ブロックの使用例

sort と sort_by

sort は比較の度に、sort_byは各要素に対し1回だけブロックを呼び出す。なのでsort_byの方が高速。
sortの場合、

現在のRubyの実装では,要素の並び方にもよりますが,4要素なら3回,100要素なら500回程度,1000要素では9500回程度呼び出されます。ですから,特に要素数が多い場合,評価用ブロックを実行するコストも無視できません。

使用例

ary.sort{|a,b|
a.to_i <=> b.to_i
}

ary.sort_by{|x| x.to_i}
制御構造を作る方法として

collect 各要素に対してブロックを評価した結果の配列を返す。
select ブロックの結果が真の要素を集める
detect ブロックの結果が真の最初の要素を返す。
reject ブロックの結果が真ではない要素を返す。

コールバックの手法として

ブロックとして渡しておいて、状況に応じて呼び出させる。(関数ポインタの本来の使い方?)