実践Rust入門 言語仕様から開発手法まで, κeen, 河野達也, 小松礼人を読みました。本書の特徴は以下の3つでしょう。

2018 Editionに対応している

FFIについて日本語で書かれた書籍

実践 を意識した内容になっている

本記事では、特に3つ目の実践的という観点で感想を述べようと思います。

Rustの言語仕様という観点で言えば、プログラミングRustのほうが網羅性は高いでしょう。 しかし、Rustは入門のハードルがとても高い言語です。1

個人的な経験でいえば、 map や filter でさえHaskellを勉強していなかったら、とっつきにくかったんじゃないかと思います。他言語の経験が豊富であればまだしも、いきなりRustを始めると挫折してしまうでしょう。 だからこそ、本書のような実践的な入門書は重要だと思います。「あれもこれもやらなきゃいけない」とならずに、実際に利用されるトピックから取り組めるのはとても良いことだと思います。

また、わかってる人からすると当たり前だけど初学者はわからないというようなことが、言語化されていたのもよかったです。例えばP.151では、桁あふれのメソッドについて

検査付き演算: checked_

飽和演算: saturating_

ラッピング演算: wrapping_

桁あふれ演算: overflowing_

のprefixがつく、と言及されていました。他にもP.169のボックス化されたスライスでは、

使う機会はあまりなさそうですが、

と書かれていたりして、力の抜きどころもわかって良かったです。 プログラミングRustを読んでいると網羅性が高いのはいいんですが、これはいつ使うんだろう？となることがあるのでこういう配慮は助かります。

他にも、プログラミングRustにも載っている内容ではあるものの、 String と str の違いは最初にわからなくなりがちなところなので、メモリ表現が図解されているのもわかりやすいと思います。

また、ユニット型 () がサイズゼロだと知ってるとcollectionでSet作りたいときに () 使えば良さそうと思えるのも良かったです。以前、GoでSetライブラリを自作しようとしたときに struct{}{} だらけになったのでRustのほうが同じサイズゼロで実装するのにきれいに書けますね。 2

いいところばかりなのもあれなので、気になったところも述べます。 内容ではないですが、誤植が気になりました。 例えば、 ch07_10_closures.rs の let lookup = || assert!(s1.find('d').is_some()); に閉じカッコがないなど、コンパイルが通らないエラーは潰し込んでほしかったなと。 とはいえ、誤植はrust-jpのslackでも報告、対応してくださっているので、大きな問題はなかったです。 また、GitHubのコードは問題なく動くのでこちらも見ながら進めれば大丈夫でした。

構成で気になったのが、P.271の最後です。ここは grow を実装する前だと動かないので、初学だと動かなくてちょっと困るかもと思いました。 new しただけだとサイズ 0 しかヒープに領域確保してないので、動かないと思います。一度読み飛ばして、 grow を実装後に、戻ってくれば実行できるので、順序が逆だとわかりやすそうです。

また、本書でもマクロが使われているので、簡単な紹介くらいあるともっと良かったかと思います。

特に良かった章

最後に、個人的に勉強になった・楽しかった章の感想を残します。

第7章 所有権システム

Rust特有の概念である所有権やライフタイムについて第1部の中で特に実践的な章でした。 簡易版の Vec を実際に自分の手で実装することで、利用頻度の高い Vec の内部実装がイメージできるのは大きいと思います。 また、CopyとClone、RcとArc、FnとFnMutとFnOnceの違いが書かれていて、頭の中が整理できました。

第9章 パーサを作る

本書で一番読みたかった章です。 再帰下降パーサはmonkeyで実装したことがありましたが、Annotationをつけたことがなかったのと、エラー処理をちゃんとできるのはとても楽しかったです。

第10章 パッケージを作る

パッケージの作成、CI、crate.ioへの公開と一通り触れてよかったです。特にcrate.ioへの公開は初めてだったので勉強になりました。

第11章 Webアプリケーション、データベース接続

リクエストの受付からDBへの接続、レスポンスを返すところまで一式という章です。 Futuresに振れることができたのも大きな収穫でした。 また、CLIがこんなに簡単に書けるのかという驚きもありました。

References