2023年5月6日土曜日

【Rust】IteratorとVecの関数が多すぎ?


RustはC言語並みの実行速度、モダンな言語特有の安全性、堅牢な型システムを有するプログラミング言語です。

Stack Overflowの調査ではRustは最も愛される言語に選ばれましたが、Rust固有の概念や型システムは難解で言語の性能に比べて愛用者は少ない印象です。「好きな言語?まぁ、Rustかな。」と言った日には圧倒的玄人感で周囲を威圧させ、その眩き威光には流石の水戸黄門も平伏すしかありません。

そんな厨二病患者へのサポートも欠かさない言語、Rust。私も最近勉強を始めました。しかしサクッと競プロも問題を数問解いてみたところ、このような感想を持ちました。



ということで検証しました。


Rust


Rustの関数の個数は以下でした。(手作業のため誤差があるかもしれません)
  • Iterator: 75個
  • Vec: 50個
  • Array: 12個

やっぱりVecとIteratorの数が多いですね。これはRustがオーバーロードを実装していない点が原因の一つです。reduce関数fold関数は顕著な例で、初期値の有無のみで2つの関数に分かれています。


続いてRust以外の言語の関数の数について紹介します。


JavaScript


  • Array: 45個

(そうだよ!これだよこれ!)

JavaScriptのArrayはVecとIteratorの役割を同時に果たすことも相俟って、関数の数は少ないです。まあブラウザで動かし続けないといけないからね。そりゃ慎重にもなる。


Java


  • Stream: 33個(オーバーロードの関数名重複ありで39個)
  • List: 22個(オーバーロードの関数名重複ありで28個)
  • Arrays: 17個(オーバーロードの関数名重複ありで155個)


155個!?

これは私の推測ですが、Arraysクラスの関数の多さはJavaが互換性を残しているためだと考えられます。binarySearch関数は全部で18個存在し、T[]のようなジェネリクス以外にint[]やdouble[]を引数として用意する徹底ぶり。

しかし、比較的新しいStreamクラスについてはRustに比して関数は少なく、Listクラスについても同様です。


C#


  • LINQ(IEnumerator): 66個(オーバーロードの関数名重複ありで213個)
  • List: 32個(オーバーロードの関数名重複ありで48個)
  • Array: 32個(オーバーロードの関数名重複ありで94個)


さて私の愛するC#ですが、意外と関数が多い。競プロで使うくらいLINQ好きなんですけどね...

なんか雲行きが怪しくなりました。


Scala


さて、Pythonは組み込み関数だから比較は難しいし、あと触ったことがある言語は......Scalaかぁ。




  • Collection: 150個




結論



疑ってすまないRustくん。君も多い方なんだろうけど......

あと今日からScala叩きに転身します。


P.S. Pythonのリストの関数は11個でした。



終わり