RejectKaigi
はてなブックマーク - RubyKaigiが終わったあとにRejectKaigiを開催するよ - 角谷HTML化計画 (2007-06-07)ということでしたので、Praggerの紹介をさせていただきました。資料はこちら。
プレゼンの中で「Golf的な努力によってコードを短かく保っている」というポリシーの例に挙げた、「for/eachは禁止でinject推奨」がちょっと直感的ではなかったと思うので補足してみる。
ありがちなコードとして、こういうのを考える。
a = 0 [1,2,3,4,5].each {|x| a += x }
これで4行。これをinjectを使うと、
a = [1,2,3,4,5].inject(0) {|acc, x| acc + x }
と3行になる。さらにこの場合は、ループの中に副作用が無いので(というのはもちろん俺の好みの問題でしかないんだけど)、
a = [1,2,3,4,5].inject(0){|acc,x| acc + x }
と1行で書いても、全く違和感ない。(逆に、eachのブロックを1行で書くと、ちょっと嫌な感じがする。)
まあ実際のところこれはGolfではないので、Rubyプログラムとして違和感が無い程度に短かくする、ということでやってはいる。例えば、いくら短かくしたいと言っても、
%w(pathname yaml optparse kconv).each {|x| require x }
とはやらない、ということ。