「JavaScript、mapと同時期に実装された、someとかeveryの知名度低いんじゃないかな?」
こんな感じのツイートを見かけました。
JavaScriptのsomeは「配列のメソッドで、引数で渡した条件を満たす要素が、少なくても一つは存在すればtrue、なければfalseを返す」です。
JavaScriptのeveryは「配列のメソッドで、引数で渡した条件を、全ての要素が満たしたらtrue、そうでなければfalseを返す」です。
このツイートを見つけたその日、「someメソッド」を探すのに手間取った私は、
「確かにそうかもなー。あと多分も名前がよくないよなー」
と思いました。
「配列(やそれに近いもの)で、引数で渡した条件を満たす要素が、少なくても一つは存在すればtrue、なければfalseを返す」というメソッドは、他の多くのプログラミング言語では、anyというメソッド名で存在します。
any以外にもありますが、こんな感じ。
- Java anyMatch
- F# exists
- Scala exists
- Swift contains(where:)
私の一番好きな言語はC#です。JavaやKotlinでAndroidアプリも作ってました。まれにGroovyも使います。最近TypeScript・JavaScriptを仕事で使い始めました。
そんな私は、「JavaScriptのsomeメソッド」を見つけるのに手間取りました。理由は名前がanyじゃなかったからです。
他の言語でanyならば、多分JavaScriptにもanyなのかなーという予想が外れました。(実は、existsやcontainsは調べてた)
JavaScriptの「配列のメソッドで、引数で渡した条件を満たす要素が、少なくても一つは存在すればtrue、なければfalseを返す」なんで、anyじゃないんや!
(多分、歴史的な経緯で標準化の時にanyって名前は使えなかったとかかな?)
さて、
- 複数のプロジェクトを掛け持ちしていて、プロジェクトごとに違う言語を使う人
- 同じプロジェクトでも、部分部分で異なるプログラミング言語を使うと人
は少なくないと思います。
言語を切り替える際の頭の切り替え、大変ですよね。
各言語のコレクションライブラリは、射影・選択・数え上げ・グループ化など似たようなメソッドも多くがありますが、その実装方法・文化・流儀は異なります。そして、この投稿であげたanyやallのように、言語ごとに似たようなメソッドでも名前が違います。
多くのプログラミング言語では、「射影はmap、選択はfilter」です。しかし、C#では「射影はSelect、選択はWhere」です。これには理由があり、LINQ というC#の言語機能に由来します。理由はしっかりあって、SelectとWhereという名前がSQL由来で覚えやすいという人も、なんでMapやFilterじゃないんだという人もどちらもいると思います。
また、Java、Groovy、Scala、F#にcollectというメソッドがありますが、その仕様は全て異なります。
色々書きましたが、私の結論は
「コレクションライブラリ言語ごとに違って、大変だけれども、郷に入っては郷に従えだよね。大変だけれども」
です。
その言語を書いているときは、その言語の作法に従うのが良いと思っています。
正直、JavaScriptのsomeとeveryは覚えるのが大変だけど、頑張って覚えようと思います。
多分、忘れるなー
PS
こんな事書いておいてあれですが、C# でSelectをMapで、WhereをFilterで呼び出すライブラリを作りました。
LinqAliasです!
よかったらみてね!!!