「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です!
よかったらみてね!!!