ツンデレC#2.0 の yield 入門

Matzにっき さん経由 第3回 新しい繰り返しのスタイル − yield return文とForEachメソッド(1/4) - @IT

記事は普通に良い内容だとおもうのですが、ところどころに無用の引っかかりを感じます。

ここでRubyを説明の例に出したのは、Rubyが優秀な言語であり、C#は努力によってRubyに近づくことができる……という主張を行うためではない。 Rubyは面白い言語ではあるが、本来の能力から 見ると、最近の社会的な評価は過剰に高すぎるという印象がある。

書き方の問題であると思います。Range オブジェクトを作るのに「これはサンプルのためのサンプルでない」と言い訳し、その論拠として Ruby を示し、そこでハッと「だ、だからって Rubyなんかがスゴイっていってるんじゃないんだからねっ!」とツンデレモード....。なにしてるんですか...。

フツーに最後に「今回自作した Range クラスは一見サンプル然としているが、じつは Python などではよく使われるオブジェクトである。・・・。」って書き添えればいいじゃないと思ってしまいます。それに 「る、Rubyなんて、みとめたわけじゃないんだからねっ!」の部分も「あちらにはかわりに C言語スタイルの for文が無い」で十分かとおもうのですけど。――まぁ、だからこそツンデレ萌えなのです*1

それにしても Rangeなんて、まんまな Python じゃなくって Ruby を引っ張り出してくるあたり失礼しちゃいます。ぷんぷん。


* * *


話は変わって Interaval オブジェクトを使った数え上げループのメリットは、私にとっては 変数の書き間違えなんてレアケースの防止策よりも、単に読みやすいという方が大きく感じます。

/* C */
for (i = 0; i < 10; i++)
{
   ....
}

よりも

"Smalltalk"
0 to: 9 do: [:each | .... ]
# Ruby
0 upto 9 do |x|
  ....
end

for i in 0..9
  ....
end
# Python
for i in range(0,10):
    ....

のほうが コードがダンゼン直感的だとおもうのです。

両方が同じように読みやすく感じる人は、for (i=0; i*2。

*1:わざと釣り餌を仕掛け、記事の注目度を上げようとしたのなら、見事 大物まつもとさんを釣り上げたと言うことになります。川俣さん、恐ろしい子

*2:これはイディオムだから、元記事の例が for (i=0; i<=9; i++) になっているのはいただけません。無理にRubyに数を合わせようとして <= を使ってしまうあたりやはりツンデレ