実践Rust入門 読書メモ
第1章 Rustの特徴 Firefoxの開発元であるMozillaが中心となって開発された。 不正なメモリ領域を指すポインタを許容しない、など安全性を重視している。 また、ガベージコレクションのような複雑なランタイムを持たない。 Stack Overflowのアンケートでは、「最も愛されている言語」で2016年から2018年まで3年連続1位となった。 コンパイラ・バックエンドとしては、LLVMが採用されている。 x86系Linuxを含むいくつかの環境では、外部ライブラリとの静的リンクもサポートしている。 導入事例についても見ていく。 Dropboxの分散ストレージシステム Magic Pocket では、 最初のバージョンが Go で書かれ、そのあと Rust で書き直された。 国内でもドワンゴが分散オブジェクトストレージ Frugalos を開発で採用した。 JavaScriptパッケージレジストリである npm のユーザ認証部分もRustで書かれている。 AWS は、サーバレスコンピューティングのためのセキュアな仮想マシン Firecracker を開発した。 第2章 はじめてのRustプログラム Rustツールチェインは、Rustコンパイラ rustc、パッケージマネージャ cargo、 標準ライブラリ std からなる。 rustup を使うと stable版やnightly版といった複数のツールチェインを管理できる。 また、パッケージのトップディレクトリにrust-toolchainというファイルを作り、 nightlyと書き込んでおくと、そのパッケージではnightlyを利用できる。 nightly版には実験的な機能が含まれていて、毎晩リリースされる。 .rustupディレクトリはrustupによって管理され、.cargoはcargoによって管理される。 前者にはツールチェインの本体、後者にはrustc、cargo、rustupコマンドが配置される。 source ~/.cargo/envして使う。 cargo new --bin helloで新規パッケージを作成する。 println!のように最後に!がついているものはマクロなので、初期段階で評価・展開される。 x.func()は、メソッド呼び出し構文でありfunc(&x)と解釈される。 fn hoge<F>(..) where F: トレイト境界では、Fがwhere句で示されるトレイト境界を満たす型であれば、 どれでも指定できる。 デバッグには、直接GDBを使うよりもrust-lldbやrust-gdbを使うのが便利。 互換性のないエディション(2015エディションと2018エディションの2種類)があり、クレート単位でCargo.tomlで指定できる。 muslターゲットを選択すると、外部ライブラリと静的リンクしたバイナリを作成できる。 第3章 クイックツアー 関数・変数・定数など識別子はスネークケース、型パラメータは英大文字1文字にするのが良い。 自動フォーマッタrustfmtがあるので、それを使うと便利。 エラーメッセージ対してrustc --explain 308で原因・対処法を調べることができる。 implブロックに、メソッドを実装していく。 クロージャは文脈によってFn、FnMut、FnOnceトレイトが自動的に実装される。 PartialEqトレイトやDebugトレイトは#[derive(Debug, PartialEq)]アトリビュートによって自動導出できる。...