こんにちは、んだです。
本日のテーマはCommand-Line Rust (English Edition)
Command-Line Rust をざっと写経してみたので、その感想をメモっていきます。
全14章でして、今回は7章までを書いていきます。
読んだきっかけと目的
きっかけとしては、会社の同僚の方が読んでいて、僕も便乗して読もうと思ったからです。
目的は別にあり、次は、この本読破したいと思ったからです。
Goによる並行処理が終わったら、お次はrustでどうアトミックな処理を扱っているかが知りたくなっており、その準備として読みました。
Chapter2
Chapter2は、echoコマンドを書いていく。
完成すると、
$ cargo run nda dayo honto dayo Finished dev [unoptimized + debuginfo] target(s) in 0.04s Running `target/debug/echor nda dayo honto dayo` nda dayo honto dayo
的な感じで、echoコマンドとして動く。clap crateを使用して、引数をparseする。
Goだと、pkg flagがあるが、似たような感じ。
実装については、echo自体の機能がシンプルなのでつまずくことはなかった。
良いなーと思った点は、TestResultに途中から置き換えてより安全な実装に修正していくところ。あとは、Unit testもrun fn
というヘルパー関数を置いて見通しをよくするところも、ですよねーな展開だった。
Chapter3
Chapter3は、catコマンド。echoに比べると、optionを捌いたりファイル操作だったり、やることがちょいと複雑になる。
で、Chapter3からはテストファーストで進んでいく。2章では慣らしのために敢えてテストアフターで実装を進めたらしい。
catコマンドの実装とは関係ないが、?演算子
よいっすね。
値がErrなら、 returnキーワードを使ったかのように関数全体からErrの中身が返ってくる。これなら、Goのようにif err != nil
を連呼しなくてよい。
2章から登場していたが、3章で良さに気がつきましたw
3章では、ざっとこんなことを理解しました。
- 構造体について
- pub キーワード(デフォルトは、private
- Iterator::enumerateの使い方。
Chapter4
Chapter4は、headコマンド
前章までは、他の言語同様tests/配下にテストコードを書いていたが、どうやらunit testは同じファイルに書けてしまうくさいです。これは、読みやすくてよさそうです。
また、Option型という型も使い勝手がよい。
headコマンドの引数の定義ですが、bytesはOption型で定義されている。
pub struct Config { files: Vec<String>, lines: usize, bytes: Option<usize>, }
で、bytesの値を取得するときには、こんな感じでNull安全でとれる
if let Some(num_bytes) = config.bytes {
Chapter5
Chapter5はwcコマンド。
途中、PartialEqが登場する。こう実装しておくと、構造体同士を比較するときに便利。
#[derive(Debug, PartialEq)] pub struct FileInfo { num_lines: usize, num_words: usize, num_bytes: usize, num_chars: usize, }
それから、#[cfg(test)]
のアトリビュートも、なかなかイカしている。#[cfg(test)]
はテストの時だけコンパイルされるので、プロダクト環境のビルドには影響しない。
まとめ
唐突にまとめ。
読破するつもりだったのですが、5章で飽きてしまいやした。
というのも、この本、章が進んでもやることがあんまり変わらないのですよ。ハンズオン 系の本って、章が進むと同じ処理でも、違う書き方を見せてくれたり刺激がありますが、この本はほとんど同じ。
一方で、同じ処理を何度も書くメリットとしては、同じ処理を何度も目にするので、自然と気になってくる。で、Docsで確認して少しずつ習得するっていうスタイルで進めることができる。
Rustのクマ本、をやることになったときに少しでも効果があれば嬉しい。
僕から以上。あったかくして寝ろよー