メモ 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 ブロックの結果が真ではない要素を返す。
コールバックの手法として
ブロックとして渡しておいて、状況に応じて呼び出させる。(関数ポインタの本来の使い方?)