Open16

Rustのおべんきょ

arinc0arinc0

use assert_cmd::Command;
Command::cargo_bin("hello").unwrap();

することで、PATH、パスが通ってないコマンドを実行できるようになる。

arinc0arinc0

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

arinc0arinc0

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

arinc0arinc0

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

arinc0arinc0

ベクタは可変長配列
strはUTF-8のみ

Vec::join()がある
textはstrのベクタ

println!("{}", text.join(" "));
arinc0arinc0

Display traitを実装

println!("{}", text.join(" "));

Debug traitを実装

println!("{:?}", text);
arinc0arinc0

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

arinc0arinc0

Box は、データをスタックではなくヒープに格納できる。

type TestResult = Result<(), Box<dyn std::error::Error>>;

これは、OKにはユニット型、Errにはstd::error::Errorgrepを実装したものならなんでも保持できるという意味。
dynの部分の仕組みを動的ディスパッチと呼ぶ

arinc0arinc0

Rustでは、String型がヒープメモリを使用し、&str型がスタックメモリを使用します。

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

arinc0arinc0

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