Think Proof, Count Two

and look for a red shoe

読書ログ: バックエンドエンジニアを目指す人のための Rust

技術書を読んだので備忘録を兼ねてメモを残しておく。

書誌情報

筆者の Rust 勉強具合

The Rust Programming Language 日本語版 (以後 Rust Book とする) は一通り読んだ。16 章の「恐るな!並行性」や、19章の「高度な機能」の理解はちょっと怪しい。20 章の「最後のプロジェクト:マルチスレッドのWebサーバを構築する」は流し読みしただけ。

Command Line Applications in Rust (CLI in Rust) は流し読みした程度、手は動かしていない。

感想

Rust Book を読んだ後、感覚を掴むためにサンプルコードを写経するような読み方をしたが、このような読み方が合っているかもしれない。 本書では trait などの取り扱いがないので、本書だけでは色々と知識が不足する印象を受けた。

Rust Book で詰まるところがなかった人であれば本書は読まなくても良い気がする。

読書メモ

1~2章

特筆すべきことはなく、サラッと読んで次へ。

3~9章

基本文法は Rust Book で読んでいたので、手を動かす練習を兼ねてサンプルコードを写経した。 rstest は初めて知ったので、ドキュメントを流し読みしてみた。

10章

バージョン指定せず最新のクレートを cargo add したら少し苦労した。 具体的には askama v0.13 からは askama_actix のような integration crates は削除されたようなので、レンダリングは askama のドキュメントを読みながら適宜書き換えながら進めた。

ちょっと気になったところ

下のサンプルコードで pool.as_ref() としているのは web::Data<SqlitePool> から SqlitePool を取り出すためだと思うのだが、 web::Data は AsRef を実装していなさそうだった[1]web::Data<T> の中身は Arc<T> のようなので[2]Arc<T>as_ref 実装[3]が使える、ということなのかもしれない。

use actix_web::{Responder, get, web};
use sqlx::SqlitePool;

#[get("/")]
async fn todo(pool: web::Data<SqlitePool>) -> impl Responder {
    let rows = sqlx::query("SELECT task FROM tasks;")
        .fetch_all(pool.as_ref())
        .await
        .unwrap()
    // 略
}

11章

サラッと斜め読みして次へ。

12章

Rust Book 16章を読んでいないとわかりにくいのでは、と思いつつも、チャネルの使い方は Rust Book よりも具体的で分かりやすかもしれない。


  1. 似たようなメソッド get_ref もあって、こちらを使っても良い ↩︎

  2. https://docs.rs/actix-web/4.11.0/src/actix_web/data.rs.html#90 ↩︎

  3. https://doc.rust-lang.org/std/sync/struct.Arc.html#impl-AsRef<T>-for-Arc<T,+A> ↩︎