2019年にRustで初めてツールを作るときに役にたったリンク集

Rustで作るツールのお試しとして https://github.com/yutakatay/dotplugs を作りました。ツール自体は大したことはしていないので、作る際によく参考にしていたサイトと使い方を紹介しようと思います。

調べたところリンク集はすでにあって、以下は体系的にまとまっていました。
- https://qiita.com/mosh/items/7e327dafbe53b72ad99d
- http://letten.hatenablog.com/entry/the-rust-resources-ja


ここではより実践的に役にたったもの(主に日本語で)を上げて行きたいと思います。


## 書き始める前に準備すべきツール

実際にコードを書く前に絶対にあったほうが便利なツールを紹介しておきます。英語ですが公式にも載っています。 https://www.rust-lang.org/tools

- [rustfmt](https://github.com/rust-lang/rustfmt): コードを自動整形してくれます
- [clippy](https://github.com/rust-lang/rust-clippy): コードをチェックしてくれます
- [rls](https://github.com/rust-lang/rls): 自動補完用のLSP機能を提供してくれます(エディタのプラグインに内蔵されているなら、プラグインインストール時にインストールされるので不要です)。個人的には[rust-analyzer](https://github.com/rust-analyzer/rust-analyzer)のほうがいい感じに補完してくれることが多いので好きです。


## 実際に書きはじめたあとによく見るサイト

基本的には[公式の翻訳ドキュメント](https://doc.rust-jp.rs) がよく整備されているのでそれを使うのがよいと思います。日本語翻訳が若干遅れているので日本語である程度概念を理解したら英語版を読むのがよいと思います。


さあ書き始めようかと思ってまず最初にぶち当たるのが、関数名はキャメル型で名付けるのか、スネーク型で名付けるのかとかの命名規約だと思います。
非公式らしいですが[ここの命名規約](https://sinkuu.github.io/api-guidelines/naming.html)に載っています。


あとは、なれない言語だとあれ？match文どうやって書くんだったっけ？structの初期化の方法がわからないなどはよくありますよね。
そういうときはひとつ前のバージョンの公式ドキュメント [プログラミング言語Rust 1.9ver](https://doc.rust-jp.rs/the-rust-programming-language-ja/1.9/book/README.html) が検索しやすくてよいと思います。2019/12/22 現在でもGoogleで `Rust if文` とかで検索すると出てくるのはこちらの古いドキュメントの場合が多いです。 **2019年時点でのRustを書くときはどのバージョンに対応したドキュメントなのかは意識して読んだほうがよいです**。
翻訳されている最新バージョンは[プログラミング言語Rust 2nd](https://doc.rust-jp.rs/book/second-edition)になりますが、ちょっと必要な情報を探すのが難しいです（たとえばif文の書き方を知りたいときには制御フローの章を見る必要があるなど。あと、ちょっと全体的に説明が長いです）ユースケースごとに探すのであればこちらがおすすめです（テストを書きたいなど）。

Web上にある日本語ドキュメントは一番あたらしいRust2018の記法には対応していないので最新が知りたいときは英語版になります[The Rust Programming Language](https://doc.rust-lang.org/book/title-page.html) 。本でもよい場合は自転車が表紙の[実践Rust入門](https://gihyo.jp/book/2019/978-4-297-10559-4)を読むとよいと思います。


それから、サンプルコードを見ていると、この記号の意味がよくわからない！ってときに便利なのが
https://doc.rust-jp.rs/book/second-edition/appendix-02-operators.html です。
英語になりますが、 https://cheats.rs で名前を調べて検索していくのもよい手段かと思います。す。


ある用語の意味だったり使い方だったりが公式ドキュメントを読んでもさっぱりわからんぜ！別角度からの情報がほしいぜ！ってときは
- [κeenさんのブログ](https://keens.github.io/post/)
- [簡潔なQ](https://qnighy.hatenablog.com/)
- [OPTiM Tech Blog](https://tech-blog.optim.co.jp/archive/category/Rust)
あたりがよくまとまっているのでおすすめです。


作りたいものが明確にある場合には、実際のプログラムを見て学ぶのが一番かと思います。Rust製のプログラムもだいぶ増えてきているので、 https://github.com/rust-unofficial/awesome-rust から似ているものを探して読んでみるのも手かと思います。


## Rustのコーディング中に誰しもハマる部分のリンク

### Stringとstr

関係性と変換のやり方がよくわからなくなるかと思います。この記事が一番わかりやすいように思います。
https://qiita.com/smicle/items/29a4d5d1d14ad7f77f60

### ResultとOption

Rustを書いているとResultとOptionを使う機会がすごく多いと思います。こういう風に変換したいのに！なんかうまくできない・・・コンパイラがずっと怒ってくるってときには https://qiita.com/take4s5i/items/c890fa66db3f71f41ce7 にのっているメソッドの使い方例を見るとよいと思います。

### 型変換

他の型もいろいろ変換したいけどうまくできないよ。。。ってときに見るのが https://qiita.com/legokichi/items/0f1c592d46a9aaf9a0ea です。いろいろなパターンが載っているので自分がやろうとしていることに応用できる可能性が高いです。

### エラーハンドリング

エラー処理に関しては、まとまっているいい記事があまりなかったです。個人的には公式は長くて理解しやすくはなかったです。

そして実装も
https://qiita.com/dalance/items/4704b16c0718f6dfb7c0
https://qiita.com/legokichi/items/d4819f7d464c0d2ce2b8
にもあるようにまだ混沌としてそうです。

https://qiita.com/termoshtt/items/8c015d9289613ec640f1
にもあるようにfailureで簡単に作るのがよいのかもしれません。

### ファイル分割

そろそろファイルが長くなってきたから分割したいよ〜ってときに読む記事です。
https://keens.github.io/blog/2018/12/08/rustnomoju_runotsukaikata_2018_editionhan
公式の[リファクタリング](https://doc.rust-jp.rs/book/second-edition/ch12-03-improving-error-handling-and-modularity.html)もおすすめです。

### 所有権

所有権に関しては、公式を何度も読むしかない気がします。他のブログ等でもわかりやすく記載しようとしているものもありますが、個人的には公式を熟読するのがおすすめです。（クロージャーだったりが絡むとさらに複雑度が増して・・・）

https://doc.rust-jp.rs/book/second-edition/ch04-01-what-is-ownership.html
https://doc.rust-jp.rs/book/second-edition/ch19-02-advanced-lifetimes.html

### クロージャー、イテレーター

クロージャーは新しいバージョンの方は長くて読みづらいので[前のバージョン](https://doc.rust-jp.rs/the-rust-programming-language-ja/1.9/book/closures.html)がおすすめです。
イテレーターでよく使うメソッドは https://qiita.com/lo48576/items/34887794c146042aebf1 にまとまっています。

### 非同期プログラミング

まず、[Rustの非同期プログラミングをマスターする](https://tech-blog.optim.co.jp/entry/2019/11/08/163000#Rust%E3%81%AE%E9%9D%9E%E5%90%8C%E6%9C%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AE%E7%89%B9%E5%BE%B4)
で概念と基礎を押さえます。

その後公式ドキュメント[恐れるな！並行性](https://doc.rust-jp.rs/book/second-edition/ch16-00-concurrency.html)と使っているランタイムのサンプルを見ながら実装していきます。

非同期プログラミングしているとよくいろいろなスマートポインタが出てきますが https://qiita.com/qnighy/items/4e7b9b93e7146306d20a によくまとまっています。


## Rustのコーディング中にたぶんあまりハマらないであろう項目

- テストを書く
- ビルドランナー（Cargo）を実行する
- enum、 Struct、 トレイト、ジェネリック型
- std, 外部クレートの使い方


## Rustのコーディングをやり始める上でたぶん大事なこと

- コンパイルエラーになっても諦めずに必死でがんばる
- 書き始めて３ヶ月の生産性は捨てる


## Rustの最新情報の取得方法 

最新情報を得る一番よい方法は[Rust-jpのSlack](http://rust-jp.herokuapp.com/)に参加することだと思います。

あとはRust.tokyoで登壇した人たちのTwitterをフォローするのもよいと思います。
https://rust.tokyo/sessions/ja