verilog書く人

自称ASIC設計者です。どなたかkaggle一緒に出ましょう。

【雑記】最近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++だと

#define REP(i, n) for(int i = 0; i < n; i++)

みたいなマクロ使ってる人も多いし、競プロではグローバル変数楽に使えるのも悪くはない。要は自分の中で使いこなせてればいいんです。

Nimとか楽そうだなと思います。

 

Rustだとグローバル変数が少し使いづらいですが、私はソルバstructを定義して、そのメンバ変数とするようにしてます。こんな感じ。

self.を毎回つける必要がありますが、見た目からローカル変数と区別されていい感じ。

 

最近、蟻本の解答をrustで実装してます。(初級編の一部の問題のみ)。私は勉強がてらしばらくRust使います。

GitHub - fukatani/rust-ant-book: Ant book solutions with Rust language.