読者です 読者をやめる 読者になる 読者になる

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 }

とはやらない、ということ。