kazasiki's blog

プログラミングとかゲームとか

eachメソッド(for文)は嫌い

eachメソッド(for文)は嫌いで、極力(Rubyで言うところの)mapやselectやreduceを使う。
理由は引数で与える集合と演算結果の関係性を不透明にしないためである。

文章を簡単にするため、引数の集合をxsで戻り値の集合をysとする。

mapの場合、ysはxsと同数の集合である。
ysの一要素はxsの一要素によって決定され、他の要素は関連しないことが期待される。
xsに順序がある場合、ysでもその順序が保持されることが期待される。

selectの場合、ysの1つ1つはxsのいずれかと同値であり、ysの要素数はxsと同じか、より少なくなる。
ysの一要素はxsの一要素によって決定され、他の要素は関連しないことが期待される。 (mapと同じように)
引数に順序がある場合、戻り値でもその順序が保持されることが期待される。

reduceの戻り値は1つの値である。
基本的にxsの順序に戻り値は依存する。演算が交換法則を満たす場合は、引数の順序に戻り値は依存しない。

for文やeach文は以上のことが明示的でない。よって嫌いである。
逆に言えば、特に戻り値が期待されない場合はfor文やeach文を使う。
集合を条件で絞りながら変換させたいなら、selectをしてからmapをするべきだ。

maxやsumはreduceの仲間である。findはselectにもreduceにも近い。