実践Rust入門 13日目 その1

10章1〜3節まで。

英単語数を数えるプログラムを作りながら、パケージ・ドキュメント・テストについて学ぶ感じ。

基本的に打ち込み試しながら読むスタイルで進めた。

とても参考になった。

おぼえがき
パッケージとクレート
  • 用語整理
    • クレート: 1つのRustプログラム。1つ以上のモジュールで構成される実行ファイルやライブラリ
    • パッケージ: Cargoの最小単位。複数のクレートを持てる
    • ワークスペース: 複数のパッケージで構成されるプロジェクト
    • プロジェクト: Cargoの最大単位。1つ以上のパッケージを持つ
  • CargoはRustのビルドマネージャー兼パッケージマネージャ
  • bin/libが混在しているクレートも作れる
ドキュメント
  • ///が次のアイテムに対するドキュメンテーションコメント
  • //!が上位アイテムに対するドキュメンテーションコメント
  • ドキュメントはマークダウン形式で書く
    • 行頭の*は、リストになるっぽい
    • リンクも書ける
  • ドキュメンテーションコメントのセクション
    • Panics: 関数がパニックを起こす可能性がある場合、パニックする条件
    • Errors: 関数がResultを返す場合にエラーを返す条件
    • Safety: unsafeな関数を書くときにユーザが保証すべき条件
    • Examples: 関数の使い方の例
  • ドキュメントの付け忘れを防ぐためのアトリビュートもある
    • 以下をファイルの先頭につけておくとよい
      • #![warn(missing_docs)]
      • #![deny(missing_docs)]
//! クレートの説明コメント  
//! 複数行書けるよ  

/// 次のアイテム(ここでいうCountry)に対するドキュメンテーションコメント  
/// 複数行書けるよ  
pub enum Country {  
    //! 上位アイテム(ここでいうCountry)に対するドキュメンテーションコメント  
    //! 複数行書けるよ  
    America,  
    China,  
    Japan,  
}  

/** このスタイルは非推奨とのこと */  
impl Default for Country {  
    fn default() -> Self {  
        /*! このスタイルは非推奨とのこと */  
        Country::Japan  
    }  
}  
  • cargo docで、ドキュメント作成 − cargo doc --openで、ブラウザで開ける
    cargo doc --no-depsで、依存クレートのドキュメントは作成しない
テスト
  • テスト用関数には、関数定義前に#[test]をつける
  • テスト用のアサーションマクロ
    • assert!(expr)
    • assert_eq!(left, right)
    • assert_neq!(left, right)
    • 上記マクロはフォーマット引数を取れる
      • assert!(a + b == 30, "a = {}, b = {}", a, b);
  • テスト用関数をResult型を返すようにすれば、?演算子が使える
  • パニックするテスト関数には、#[should_panic]をつける
    • パニック発生でテスト結果はOKになる
  • cargo testで、テスト実施
  • cargo test anywordで、anywordを含む名前のテスト関数のテスト実施
  • cargo test -- --exact 関数名で、指定関数のみテスト実施
  • 時間がかかるテストは、テスト関数に#[ignore]をつけておく

    • テスト実施時に、cargo test -- --ignoredとすればテストを飛ばしてくれる
  • 下記例みたいなassertを展開するマクロを用意すると便利かも

macro_rules! assert_map {  
    ($expr: expr, {$($key: expr => $value: expr),*}) => {  
        $(assert_eq!($expr[$key], $value));*  
    };  
}  

#[test]
fn test_func() {  
    let my_map = my_make_map();   
    assert_map(my_map, {"a" => 1, "b" => 3});  
    // assert_eq!(my_map["a"], 1);  
    // assert_eq!(my_map["b"], 3);  に展開される
課題
  • ワークスペースの理解が曖昧。11章で扱うらしい
  • ライブラリのファイル名はlib.rsが慣習なのだろうか

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

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