前置き
これはRustを学びたいけどどうやって勉強しようかという人向けの記事です。
自分の経験からここ先に読んどきゃよかったとか、ここ読んどけばもっと楽だったとかそんなのをいろいろまとめてあります。もう一度Rustを学び直すならどうするかなー、と考えながら書きました。なお大半が英語の資料です。
対象はRuby、Pythonなどの高レベル言語をすでに習得してる人。
前準備
Rustの主な特徴を知っておきましょう。Rustは他の言語にない考え方や特徴が多いので先に知っておくと良いです。とりあえずinto_rust() : screencasts for learning Rustを全部見ましょう
基礎知識の習得
The Bookと呼ばれる公式の入門書があります。まずこれを読みましょう。日本語訳もありますが英語版のほうが版が新しいです。
加えて実践Rust入門も手元において読みましょう。The Bookは詳細な説明が多いですがたまに冗長に感じることがあります。実践Rustは日本語ですし、図が多く簡潔にかかれているので両方使うと理解が深まります。
とりあえずこの二冊を中心にいろいろ勉強していくと良いです。
ただこの二冊では足りないところもあります。
上の二冊でカバーしきれないところ
ライフタイム
結構な鬼門です。所有関係、マクロ、ライフタイムはどこかのアンケートでも学習者がかなり苦労している項目だとかありました。The Bookのライフタイムの項目を読んでもいまいちよくわからない場合は以下の2つが参考になります
RustnomiconのLifetimeの章は更に突っ込んだ内容が書いてあります。
抽象的な知識より実例がたくさん見たい人はLearning Rust With Entirely Too Many Linked Listsを読みましょう、LinkedListをRustで実装してくチュートリアルです。ライフタイムだけでなくBox、Rc、Arcなどの実用例も豊富です。
エラー処理
The Bookにはエラー処理の章がありますがちょっと足りません。
実際ここだけ読んでコードを書き始めたらそこらじゅうunwrap()
だらけになりました。
(ドキュメントでもunwrap()
はあまりつかってくれるなとあります)
?
オペレーターを使ったほうがいいのはわかるんだけどどうすりゃいいの?
Resultを返すってどうすんの?
と思ったら、Error Handling in Rustを読みましょう。
(この記事は以前The Bookのエラー処理の章に掲載されていたようです、何が会ったか知らないが最新版では消えています。日付は古い記事ですが、Rust2018に合わせて内容が更新されています。)
BoxとかArcとかRcってなにさ?
The Bookや公式ドキュメントを読むと、BoxはリカーシブなStructを定義するときに使って、とかRcだと所有者を増やすことができて、とかいろいろ説明があります。いまいちよくわかりません、実例がほしい。
Learning Rust With Entirely Too Many Linked Listsが実例を交えて詳しく書いてあります。
マクロ
ここも鬼門。
まずはκeenさんのマクロクラブ Rust支部
が参考になりました。
最近追加されたProcMacroについては私の記事で恐縮ですがこちらRust ProcMacro 101
実例がたくさん見たいという人は、
https://github.com/azriel91/proc_macro_rules
やちょっと難しいですが
https://github.com/dtolnay/proc-macro-workshop
が良いです。proc-macro-workshopは問題の答えがありませんが、
https://github.com/ELD/proc-macro-workshop
https://github.com/jonhoo/proc-macro-workshop
https://github.com/gobanos/proc-macro-workshop
のようにフォーク先を見ると答えを書いてる人がたくさんいます。
疑問の解決
いかんいかんとわかってても、どうしてもstackoverflow-drivenな開発になっちゃいますよね。
すべてのドキュメントがよくかけてるわけではありません。
実行結果だけ知りたいのに、延々と抽象的な説明が書いてあるだけ、とか、ソースコードがいきなり貼られてるだけ、とか、実行結果みてもいまいちよくわからん、とか・・・
Rustは公式ドキュメントがとても良く書けてます
Rustは公式ドキュメントが簡潔に、かつわかりやすく書かれています。
たいてい説明に加えて、
let a = [1, 2, 3];
let doubled: Vec<i32> = a.iter()
.map(|&x| x * 2)
.collect();
assert_eq!(vec![2, 4, 6], doubled);
のようにテストコードまで載っていることがしばしば。検索もとてもスピーディです。
stackoverflowではカービーのアイコンを探す
それでもわからないときはstackoverflow。いい記事もあるのですが、全部が全部いい記事ではないですし、たまに動かないコードに出くわすことも。ちゃんとした記事かどうか見分けるには・・・?
とりあえずShepmasterさんのカービーのアイコンを探しましょう。stackoverflow上でものすごくアクティブにRustの質問を解決してる方です。経歴を見ると、Rust専門のコンサルをやっているようです。
それでもわからん、誰か教えて!
rust-jpというslackチャンネルがあります。