【雑記】最近rust試してるので感想
最近、rustで楽しく書いてます。
C++の古い部分、危険な部分をそぎ落とし、関数型言語の要素が入っているということで、これから新しくC++のプロジェクトを始めるならいっそrustで始めたらいいんじゃないかなと思いました。
まだrust歴二週間程度ですが感想まとめ。
Rustのいいところ
中・大規模プロジェクトのC++の後継としては有望な印象を受けました。
for文がよい
"for (int i=0; i < n; ++i)"より"for i in 0..j"、だってiが一回しか出なくて間違えようがないじゃないですか?
誰しも"for (int i=0; i < n; ++j)"みたいな無限ループを一回くらいは書いてしまったんじゃないですか?完全に後者が正義です。
参照、借用の仕様が安全、高速
賛否両論ありますが、要はC++のunique_ptrです。
unique_ptrはGoogle C++ Coding Styleなどではデフォルトとされており(生ポインタはできるだけ使わないようにと言われている)、真面目に書いてるとポインタ周りはほとんどRustと変わらなくなってきます。
むしろデフォルトがunique_ptrの方が楽。unique_ptrはテンプレート使っていて、IDEでメンバが追いづらかったりするし。
なれないうちはコンパイルエラーが多発しますが、ヌルポ参照のランタイムエラーデバッグするよりマシです。
変数宣言はデフォルトがイミュータブルになっていて安全
Google先生も「理にかなっているのならば、常にconst
を使ってください。 」といっており、C++は真面目にやってるとconst祭りになってきます。
tensorflowのソースコードだってconst祭りです。
だったらdefaultがconstで、mutableはちょっと使いにくくなっている方がありがたいです。
immutableの方がトラブルが少ないと言われており、安全な大規模プロジェクトを作る上では納得の仕様。
Immutableの利便性、大きなメリットについて。 - Panda Noir
デフォルトでauto型(型推論)になっていて楽
若干ですけどね。C++書いてるとconst autoばかりじゃないですか?
グローバル変数使いづらい
これもまあ、安全寄りでいい仕様です。
その他
まだあまり使いこなせてないけど、パターンマッチ、イテレータ、クロージャ、はかっこいい雰囲気があります。
boost::Optionalよく使ってますが、RustのIf let Some(x) = yでオプション捌けるのは楽。
不満
コンパイラ様を納得させなきゃいけない書き方を強要され、「うー」と思う時もあります。
vector.into_iter().by_ref().take(3).enumerate()とか地獄じゃないですか?
Pythonだったらenumerate(vector[:3])で済むのに、、まあLLと比べたらLLが書きやすいのは当たり前なんですが。
要はまとめると
Google C++ Coding Styleを守りながら気をつけてC++書くよりはRustは色々デフォルトになっててええやん、と思う。
ガベージコレクタがあっていい、そもそもLLでいい、って世界でプログラミングしてる人にはRustは必要ないです。
C++の炎に灼かれてる人のためのオアシス、それがRust。
競技プログラミングで使う言語という観点だと
これは慣れた方使えばいいです。C++だと
みたいなマクロ使ってる人も多いし、競プロではグローバル変数楽に使えるのも悪くはない。要は自分の中で使いこなせてればいいんです。
Nimとか楽そうだなと思います。
Rustだとグローバル変数が少し使いづらいですが、私はソルバstructを定義して、そのメンバ変数とするようにしてます。こんな感じ。
self.を毎回つける必要がありますが、見た目からローカル変数と区別されていい感じ。
最近、蟻本の解答をrustで実装してます。(初級編の一部の問題のみ)。私は勉強がてらしばらくRust使います。
GitHub - fukatani/rust-ant-book: Ant book solutions with Rust language.