Rustの日本語書籍紹介

# はじめに

この記事は[Rust Advent Calendar 2020](https://qiita.com/advent-calendar/2020/rust)の3日目です。

今年の春から夏にかけて、「実践Rustプログラミング入門」という本を書いていました。お陰さまで売上好調のようでありがとうございます。（ちなみにちょうど昨日、電子書籍版も出ました）

この本を書くにあたって、すでにいくつかRustの日本語書籍があるなか新しい本を出すということで、既刊との差別化をどう図るかは考えないといけないと思っていました。その時にRust本を一通り読み直したので、それぞれどのような本であるかを簡単にまとめておこうと思います。

基本的な書誌情報に加え、Rustコンパイラのバージョンとエディション、内容のざっくりとした方向性（実践よりか文法解説よりか、といったような）を書いていきます。いくつかの本にはよく使われる呼び名があるのでそちらも書いておきました。

Rustはいろいろなプログラミング言語からうまくいった言語機能を取り込んできたため、かなり学ぶべきことの多い言語です。（逆に多様な言語の経験のある方にとっては「ああ、あの言語のあれね」的に理解しやすい面もあるのですが）

そのため「一冊で全ての文法を網羅しつつ、豊富な実践例も載せる」というのは難しく、どの本もある程度の割りきりがあります。ここは人によって「厳密な文法を先に知りたい」とか「実例があれば雰囲気でなんとかなる」など好みの分かれるところだと思います。皆さん自分に合いそうな本を探してみてください。内容が分かりやすいかどうかは人によると思うので言及しません。順番は発行順とします。

最後に書籍を選ぶうえでの補足情報として、「（比較的）古い本を選ぶときの注意点」と「日本語の参考サイト」を書きました。

Rustの日本語書籍を選ぶ際の参考になれば幸いです。

## [プログラミングRust](https://www.amazon.co.jp/dp/4873118557)

* 発行日: 2018/8/10
* サイズ: B5/608p
* 出版社: オライリージャパン
* Rustバージョン: 1.17
* Rustエディション: 2015
* 通称: 蟹本

文法解説メインで実践例はほとんどありません。特に標準ライブラリの解説が詳細です。また、標準ライブラリが提供するデータ構造のメモリレイアウトなど、内部実装に踏み込んだ解説が多いのも特徴です。

## [実践Rust入門［言語仕様から開発手法まで］](https://www.amazon.co.jp/dp/B07QVQ7RDG)

* 発行日: 2019/5/8
* サイズ: B5/576p
* 出版社: 技術評論社
* Rustバージョン: 1.32
* Rustエディション: 2018
* 通称: 自転車本

文法が7割、実践が3割ということでかなり実践重視の本になります。実践編ではCLI/WebアプリやFFIの例に加えて、実際にパッケージをリリースするチュートリアルがあります。

## [プログラミング言語Rust 公式ガイド](https://www.amazon.co.jp/dp/B07TQL7BB9)

* 発行日: 2019/7/5
* サイズ: B5/608p
* 出版社: アスキードワンゴ
* Rustバージョン: 1.21
* Rustエディション: 2015

公式の解説書である[The Rust Programming Language](https://doc.rust-lang.org/book/)(通称TRPL)の日本語訳です。
公式ということもあり文法解説がかなり詳細ですが、実践例はあまりありません。

## [Rustプログラミング入門](https://www.amazon.co.jp/dp/B07Z6CNKB3)

* 発行日: 2019/10/11
* サイズ: A5/304p
* 出版社: オーム社
* Rustバージョン: 1.35
* Rustエディション: 2018

Rust本のなかで最もコンパクトで、メモリ安全性の部分に絞った解説です。
他のRust本ではあまり見かけない生ポインタやunsafeが序盤から登場するなど少し独特な構成です。

## [プログラミング言語Rust入門](https://www.amazon.co.jp/dp/B087BZQ48R)

* 発行日: 2020/3/25
* サイズ: B5/360p
* 出版社: 日経BP
* Rustバージョン: 1.41
* Rustエディション: 2018

文法解説がメインですが、後半にいくつかの実践例があります。実践例の中ではDBが手厚く、SQLを書くパターンとdiselによるORMの両方が取り上げられています。

## [実践Rustプログラミング入門](https://www.amazon.co.jp/dp/4798061700)

* 発行日: 2020/8/22
* サイズ: B5/512p
* 出版社: 秀和システム
* Rustバージョン: 1.44
* Rustエディション: 2018
* 通称: 歯車本

全体の7割ほどが実践編となっており、最も実践よりの本です。WASMやGUI、組み込みといったこれまでのRust本で取り上げられなかった実践例や、サードパーティー製のツールを含めたエコシステムの解説が詳細です。

# 補足

## （比較的）古い本を選ぶ際の注意点

Rustはまだ新しい言語で日々進化しています。そのため1~2年前の本であっても最新のRustからは多少乖離があります。といってもRustは後方互換性を重視しており、ほとんどの記述は今でも有効です。ここでは、（比較的）古い本を参考にする上での注意点を書いておきます。

まず、エディションが2015か2018かが重要な指標となります。エディション変更時には非互換な文法上の変更などが入っており、2015エディションのコードは（最新のRustコンパイラのデフォルト設定である）2018エディションではコンパイルエラーとなるかもしれません。
Rustでプロジェクトを作成した際に作成される`Cargo.toml`という設定ファイルに`edition = "2018"`という項目がありますが、これを`edition = "2015"`に変更することで、コンパイラのモードが2015エディションに切り替わり、2015エディションの書籍に載っているコードをコンパイルすることができるようになります。

また、もう一つ問題になりやすい点として、NLLが挙げられます。これはNon-Lexical Lifetimesといって、Rustの特徴であるライフタイムの推論方法がRust 1.31で変わりました。詳細は割愛します（[この記事](https://qiita.com/_EnumHack/items/8b6ecdeb52e69a4ff384)が参考になります）が、従来エラーになっていたコードがエラーにならなくなっているため、書籍の記述と食い違うことがあります。
Rust本では「こういうコードを書くと所有権の問題が発生してコンパイルエラーとなります」というような説明がよく出てきますが、その通りに書いてもエラーにならないケースがあるということです。
NLLは2015エディションにも導入済みなので、エディションを切り替えてもエラーは再現できません。これについては挙動が変わったと割り切るか、古いコンパイラを使うしかありません。
（公式のセットアップツールである`rustup`を使うと古いコンパイラへも簡単に切り替えることができます）


## 日本語の参考サイト

最後に、各種Rust本を補完するWebサイトを取り上げます。

### [プログラミング言語Rust日本語版](https://doc.rust-jp.rs/book-ja/)

「プログラミング言語Rust 公式ガイド」の項目でも紹介したTRPLの非公式日本語版です。
特に文法解説が手薄なRust本を読む際には、こちらで補完するといいと思います。

### [Rust by Example日本語版](https://doc.rust-jp.rs/rust-by-example-ja/)

豊富なサンプルコードを使って文法を学べるサイトです。ブラウザ上でコードを編集して試してみることができます。
TRPLよりもっと細かい書き方が網羅されているので、一通り眺めておくと新たな発見があるかもしれません。

### [エディションガイド日本語版](https://doc.rust-jp.rs/edition-guide/)

2018エディションに対応していないRust本で学ぶ場合には、2018エディションの新機能がまとまったこのサイトを参照すると便利です。
（日本語版といいつつほとんど翻訳できていないので、翻訳者募集中です）

### [rust-jp Slack](https://rust-jp.rs)

Webサイトではないですが、こちらのSlackには（私も含め）Rust本の著者が何人か参加しています。
いくつかのRust本については質問用のチャンネルもあります。