String#succ

g:subtech:id:secondlife:20060530:1148996760 経由で

p (1..n).inject(s) {|x,| x.succ}

という表現を見てちょっと衝撃を受けました。

"n" は数値、"s" は文字列で、n 回分文字列を succ する (C 言語系の "++" みたいなもの) 方法を表したものです。

例えば n が 10 で s が "a" ならば "k" がプリントされるわけです。

この表現が生まれた経緯については上のリンク先を見ていただくとして、私個人的に驚いたのは、「オブジェクトに対してメソッドを繰り返し適用する」ことと、「その結果を得る」ことを、「範囲#inject」の一文だけで済ませている、という点です。

つまり、(私のように) まだあまり inject に慣れていない思考回路の人ならこうしていたと思うんですね (in JavaScript):

var s = "a";
var n = 10;
n.times(function(){ // あるいは for ループ
  s = s.succ();
});
print(s);

(times や succ が定義されているという前提です。String#succ については id:reinyannyan:20060401:p1 をご覧下さい)

この下 4 行が見事に一文で表現されているわけです。感銘を受けると同時に、以前自分でそういう記事を書いておきながらしばらく理解に困ったことが残念でなりません (笑。


最後に、一応 JavaScript でも書いてみました (prototype.js と String#succ が必要です):

print(new Range(1, n).inject(s, function (x){ return x.succ() }));

少々長くなるのは仕方ないですが、形としては同じですね。