Rustのおべんきょ

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
でRustインストール

println!
はマクロで print line

rustc は rust compiler

use assert_cmd::Command;
Command::cargo_bin("hello").unwrap();
することで、PATH、パスが通ってないコマンドを実行できるようになる。

bash の変数$?を調べれば、直近のコマンドの終了コードがわかる

CLIツールは、成功で0、失敗で非0を返す

ユニット型は、ほかの言語における null ポインタや未定義値とは異なります。null 参照を発明した Tony Hoare は、後に自分の発明を「10 億ドルにも相当する誤り」と呼んで謝罪しました。それを考えると、Rust では通常、null ポインタを参照解決できないという事実は、少なくとも 10 億ドルの価値があると
言えるでしょう。

Argsは構造体

ベクタは可変長配列
strはUTF-8のみ
Vec::join()がある
textはstrのベクタ
println!("{}", text.join(" "));

Display traitを実装
println!("{}", text.join(" "));
Debug traitを実装
println!("{:?}", text);

プリミティブ型もtrait実装を持てる、持ってる

Rustのifは式

Box は、データをスタックではなくヒープに格納できる。
type TestResult = Result<(), Box<dyn std::error::Error>>;
これは、OKにはユニット型、Errにはstd::error::Errorgrepを実装したものならなんでも保持できるという意味。
dynの部分の仕組みを動的ディスパッチと呼ぶ

Rustでは、String型がヒープメモリを使用し、&str型がスタックメモリを使用します。
ファイルを文字列として読み込む時、大きくなる可能性があるならヒープメモリに入れた方が良いし、上限が決まっているなら固定長でスタックメモリを使用する方が良い。

Command::cargo_bin("echor").unwrap()
は、Errが発生するとパニックを起こす
Command::cargo_bin("echor")?
のようにクエスチョンマーク演算子を使用すると、Ok値を返すかErr値を呼び出し元に返却するようになる。

panic!が発生しても大きな問題はなさそうだが、テストがエラーを返してメッセージを表示してくれるのと、テスト自体が落ちて死んだは少しニュアンスが違いそうで、panic!の方が原因を追いづらくもあるらしいのでpanic!が出るような状態のテストは書かない方が良いっぽい。