続・for-eachのシンタックスがカオスすぎる。
高木です。おはようございます。
昨夜の続きです。
本当は昨夜だけで終わらせるつもりだったのですが、あまりにも長文化してしまいました。
今朝で何とか終わらせたいので、早速本題に入ります。
昨夜はPHPのforeachについて書きましたので、今回はC#のforeachについて書くことにします。
C#が登場したのは2002年だったと思いますが、その当時からforeachの書き方は次のようになっていたはずです。
1 2 3 | foreach (object e in list) { } |
ここでは要素の型を仮にobjectとしました。
当時はジェネリクスがなくvarも使えませんでしたが、そこは今回の議論の本質ではありません。
C++/CLIが登場したのは2005年でした。
この言語でもfor-eachが使えましたが、どういうわけかシンタックスはC#と異なり、次のようになっています。
1 2 3 | for each (Object^ e in list) { } |
なぜ、foreachではなくfor eachになったのか、まったくの謎です。
この辺りからカオス感が漂ってきましたね。
Javaに拡張for文が導入されたのはJ2SE 5.0からですので、2004年のことになります。
シンタックスは次のようになります。
1 2 3 | for (Object e : list) { } |
拡張for文と同時にジェネリクスとオートボクシングが導入されたので、それなりにいい感じに使えると思います。
(C++/CLIではなく)標準C++にRanged-for文が導入されたのは2011年のC++11からです。
1 2 3 | for (auto e : list) { } |
Javaのシンタックスを流用したようです。
同時にautoを使った型推論もできるようになり、使い勝手がよくなりました。
さて、JavaScriptの番がいよいよやってきました。
JavaScriptの初期の状況はわかりませんが、1999年のECMAScript 3の規格書を見る限り、すでにfor…in文が導入されていました。
次のように書くようです。
1 2 3 | for (var e in list) { } |
ただ、ほかの言語とは異なり、このfor…in文で取り出せるのは要素の値ではなくプロパティになるようです。
つまり、配列の添え数や連想配列のキーが取り出せるわけです。
そういうこともあってか、2005年の(ECMAScriptではなく)JavaScript 1.6ではfor each…in文が導入されます。
1 2 3 | for each (var e in list) { } |
しかし、結局ECMAScriptに取り込まれることなく非推奨扱いになってしまいます。
現在はまったく使えないようです。
代わりに、2015年にECMAScriptに導入されたのがfor…of文だといいます。
1 2 3 | for (var e of list) { } |
こちらのほうが、他の言語に見られるfor-eachに相当するものだと思います。
for…in文のほうはJavaScript特有のプロトタイプ汚染の影響を受けるなど、私のような初心者がビックリするような振る舞いをします。
こうやって各言語のfor-eachを見てきたところ、JavaScriptが一番複雑で扱いが難しいように思います。
いずれにせよ、同じことをしたいだけなのに、こんなにもシンタックスがバラバラになってしまっては大変です。
まるでバベルの塔のエピソードのようです。