2週間ほど前からRustでAtCoderの問題を解いています。 ABSとABC300~313のABC埋めが終わったので、初学者なりに感じたことをまとめてみます。
筆者のバックグラウンドとしては数年前にC++を使って水色に到達し、その後ずっと放置していましたが最近復帰し言語を変えてみたという経緯です。
Rustを使おうか迷っている人の参考になれば幸いです。
一応個人的に重要だと思う順に並んでいます。
Segmentation Fault.
C++erならこのメッセージと格闘したことがない人はいないでしょう…競プロなら大体範囲外アクセスです。
Rustならどこで範囲外アクセスが起きたのか教えてくれます。もっと言えばイテレーションを使えば良いことも多いので、そもそも添字アクセスする機会すら少なくなります。最高です。
自分は新しい言語で競プロをするときは、
という方法をとります。 その言語特有の書き方や便利な標準ライブラリなど学べることがとても多いからです。
Rustだと自分は特にsansenさんを参考にしています。 コードがスマートですし、赤コーダーかつABC312では1位を取るなど実力も凄まじいです。参考にできる人がいるというのは大事ですよね。
Rust Bookにもある通りRustは開発ツールが整備されています。
CargoはRustの依存関係管理ツール兼ビルドツールで、ライブラリやツールを導入したいと思ったら大抵はCargoで解決できます。
Rustfmtという標準フォーマッタが用意されており、簡単に導入できます。自分は実装が苦手なのもあり愛用しています。
(参考:実装力で戦える! ~競プロにおける実装テクニック14選~, @e869120)
rust-analyzerによってメソッドのサジェストや型推論、コンパイルエラーもほぼ事前に教えてくれるなどとにかくコーディングが楽になります。
(参考:rust-analyzerを使ってみたら思いのほか素敵だったので紹介してみる, @simonritchie)
そもそもString
と&str
は違うとか、結合はString
と&str
じゃないとできないとか、String
はコピーできないからクローンしろとか…文字列に関しては今も苦しんでいます。
幸いAtCoderではproconioが使えて、入力でproconio::marker::Charsとして受け取ればC++のStringチックに扱えるので最近はもっぱらそうしています。
Rustではメモリ管理のためにmalloc/freeやGCを採用せず所有権という仕組みを採用しています。
これがびっくりするくらい難しい。moveできないとかborrowできないとかこれはsecond borrowだからダメだとか…
こればっかりはもうちょっと仲良くならないといけないな、と感じます。
当然ですが、RustはC++ではありません。
競プロの解説には大抵C++はありますがRustはありません。Qiitaなんかの記事の参考実装もC++であることがほとんどです。世界最強touristのコードを参考にしようにもC++です。
Rustに限らずC++以外で競プロをやると立ちはだかる壁だとは思いますが、今までC++でやっていただけに少しストレスです。
総評としては満足で、今後もRustを使っていこうと思っています。
幸せになれる点も多いですし、個人的には記法も好みでかなり気持ちよくコーディングできています。辛い点も最後の点以外は勉強すれば解消していけると前向きに捉えています。
Rust、おすすめです。