大阪市中央区 システムソフトウェア開発会社

営業時間:平日09:15〜18:15
MENU

続・for-eachのシンタックスがカオスすぎる。

著者:高木信尚
公開日:2018/05/28
最終更新日:2018/05/27
カテゴリー:技術情報
タグ:

高木です。おはようございます。

昨夜の続きです。
本当は昨夜だけで終わらせるつもりだったのですが、あまりにも長文化してしまいました。
今朝で何とか終わらせたいので、早速本題に入ります。

昨夜はPHPのforeachについて書きましたので、今回はC#のforeachについて書くことにします。
C#が登場したのは2002年だったと思いますが、その当時からforeachの書き方は次のようになっていたはずです。

ここでは要素の型を仮にobjectとしました。
当時はジェネリクスがなくvarも使えませんでしたが、そこは今回の議論の本質ではありません。

C++/CLIが登場したのは2005年でした。
この言語でもfor-eachが使えましたが、どういうわけかシンタックスはC#と異なり、次のようになっています。

なぜ、foreachではなくfor eachになったのか、まったくの謎です。
この辺りからカオス感が漂ってきましたね。

Javaに拡張for文が導入されたのはJ2SE 5.0からですので、2004年のことになります。
シンタックスは次のようになります。

拡張for文と同時にジェネリクスとオートボクシングが導入されたので、それなりにいい感じに使えると思います。

(C++/CLIではなく)標準C++にRanged-for文が導入されたのは2011年のC++11からです。

Javaのシンタックスを流用したようです。
同時にautoを使った型推論もできるようになり、使い勝手がよくなりました。

さて、JavaScriptの番がいよいよやってきました。
JavaScriptの初期の状況はわかりませんが、1999年のECMAScript 3の規格書を見る限り、すでにfor…in文が導入されていました。
次のように書くようです。

ただ、ほかの言語とは異なり、このfor…in文で取り出せるのは要素の値ではなくプロパティになるようです。
つまり、配列の添え数や連想配列のキーが取り出せるわけです。

そういうこともあってか、2005年の(ECMAScriptではなく)JavaScript 1.6ではfor each…in文が導入されます。

しかし、結局ECMAScriptに取り込まれることなく非推奨扱いになってしまいます。
現在はまったく使えないようです。

代わりに、2015年にECMAScriptに導入されたのがfor…of文だといいます。

こちらのほうが、他の言語に見られるfor-eachに相当するものだと思います。
for…in文のほうはJavaScript特有のプロトタイプ汚染の影響を受けるなど、私のような初心者がビックリするような振る舞いをします。

こうやって各言語のfor-eachを見てきたところ、JavaScriptが一番複雑で扱いが難しいように思います。
いずれにせよ、同じことをしたいだけなのに、こんなにもシンタックスがバラバラになってしまっては大変です。
まるでバベルの塔のエピソードのようです。

    上に戻る