Edited at

JavaScriptのsomeがanyって名前じゃなかったから探しにくかった話

「JavaScript、mapと同時期に実装された、someとかeveryの知名度低いんじゃないかな?」

こんな感じのツイートを見かけました。

JavaScriptのsomeは「配列のメソッドで、引数で渡した条件を満たす要素が、少なくても一つは存在すればtrue、なければfalseを返す」です。

JavaScriptのeveryは「配列のメソッドで、引数で渡した条件を、全ての要素が満たしたらtrue、そうでなければfalseを返す」です。

このツイートを見つけたその日、「someメソッド」を探すのに手間取った私は、

「確かにそうかもなー。あと多分も名前がよくないよなー」

と思いました。


「配列(やそれに近いもの)で、引数で渡した条件を満たす要素が、少なくても一つは存在すればtrue、なければfalseを返す」というメソッドは、他の多くのプログラミング言語では、anyというメソッド名で存在します。

any以外にもありますが、こんな感じ。


私の一番好きな言語はC#です。JavaやKotlinでAndroidアプリも作ってました。まれにGroovyも使います。最近TypeScript・JavaScriptを仕事で使い始めました。

そんな私は、「JavaScriptのsomeメソッド」を見つけるのに手間取りました。理由は名前がanyじゃなかったからです。

他の言語でanyならば、多分JavaScriptにもanyなのかなーという予想が外れました。(実は、existscontainsは調べてた)

JavaScriptの「配列のメソッドで、引数で渡した条件を満たす要素が、少なくても一つは存在すればtrue、なければfalseを返す」なんで、anyじゃないんや!

(多分、歴史的な経緯で標準化の時にanyって名前は使えなかったとかかな?)


さて、


  • 複数のプロジェクトを掛け持ちしていて、プロジェクトごとに違う言語を使う人

  • 同じプロジェクトでも、部分部分で異なるプログラミング言語を使うと人

は少なくないと思います。

言語を切り替える際の頭の切り替え、大変ですよね。

各言語のコレクションライブラリは、射影・選択・数え上げ・グループ化など似たようなメソッドも多くがありますが、その実装方法・文化・流儀は異なります。そして、この投稿であげたanyallのように、言語ごとに似たようなメソッドでも名前が違います。

多くのプログラミング言語では、「射影はmap、選択はfilter」です。しかし、C#では「射影はSelect、選択はWhere」です。これには理由があり、LINQというC#の言語機能に由来します。理由はしっかりあって、SelectWhereという名前がSQL由来で覚えやすいという人も、なんでMapFilterじゃないんだという人もどちらもいると思います。

また、Java、Groovy、Scala、F#にcollectというメソッドがありますが、その仕様は全て異なります。


色々書きましたが、私の結論は

「コレクションライブラリ言語ごとに違って、大変だけれども、郷に入っては郷に従えだよね。大変だけれども」

です。

その言語を書いているときは、その言語の作法に従うのが良いと思っています。

正直、JavaScriptのsomeeveryは覚えるのが大変だけど、頑張って覚えようと思います。

多分、忘れるなー


PS

こんな事書いておいてあれですが、C# でSelectMapで、WhereFilterで呼び出すライブラリを作りました。

LinqAliasです!

よかったらみてね!!!

https://github.com/RyotaMurohoshi/LinqAlias