実践Rust入門 12日目

9章全部。

整数の四則演算ができる計算機のパーサを作成を通して、手続の抽象化とエラーの扱いを学ぶ。

サンプルコードを打ち込みながら読むスタイルで進めた。

サンプルコードの誤記が多く、正誤表だけだと辛い。
また、一部サンプルコードの掲載が省かれている。
(省く旨は、P383にサラッと書かれている。。。)

なので、githubからサンプルコードを落として参考にした方が良い。

おぼえがき
  • パーサの紹介
    • nom ... マクロベース。多機能かつ非常に高速とのこと
    • combine ... 関数ベース
    • pest ... PEGベース
  • Option::ok_or()は、Option型からResult型へ変換する
  • Result::and_then()は、Result型からResult型を返す関数につなげる
    • Rustのエラーを扱うほとんどの関数がResult型を返すので、and_thenで続けてプログラムを書ける
    • Result以外にも、Optionや外部ライブラリにもand_thenは定義されているものが多いらしい
  • match式のelseケースは適当な変数名を指定すればelseになる、かつその変数に束縛する
  • Errorトレイトは過渡期っぽい。Rust1.33からは下記が推奨の模様。
    • descriptionよりDisplayトレイトを使う
    • causeは使わずに、sourceを使う
  • Errorトレイトは、Displayを継承している
課題
  • C言語なら構造体そのまま渡して関数内部でアクセスするような場面
    • Rustだと、渡す構造体自体をミュータブルかイミュータブルで渡すことになる
    • その為、各メンバをそれぞれ引数に渡す方が安全ではあるが、ちょっと面倒
    • 別の方法としてCellと内部ミュータビリティを導入する方法があるらしい
  • マクロ定義方法
気になったこと

正誤表にない誤記もいくつかあった。

  • P393 compile_inner関数内の誤記
    • 誤:match *expr {
    • 正:match expr.value {
  • P393 compile_uniop関数内の誤記
    • 1箇所目
      • 誤:use self::UniOp::*;
      • 正:use self::UniOpKind::*;
    • 2箇所目
      • 誤:match *op {
      • 正:match op.value {
  • P393 compile_binop関数内の誤記
    • 誤:match *op {
    • 正:match op.value {
  • P393 refキーワードの説明って本書内にあったっけ?

実践Rust入門[言語仕様から開発手法まで]

実践Rust入門[言語仕様から開発手法まで]