目次

Rustの勉強[CLI作成編 その8]

(更新: )ぎじゅつ

はじめに

#

NO IMAGEThe Rust Programming Language 日本語版 - The Rust Programming Language 日本語版
を読んでいる

  • こうやって地道にゆっくり書くのはいい
  • 作るのはclaude codeでよくて理解はゆっくり作ればいいので逆に向いているかも

お勉強

#

NO IMAGEテスト駆動開発でライブラリの機能を開発する - The Rust Programming Language 日本語版

メモ

#

今や、ロジックをsrc/lib.rsに抜き出し、引数集めとエラー処理をsrc/main.rsに残したので、 コードの核となる機能のテストを書くのが非常に容易になりました。いろんな引数で関数を直接呼び出し、 コマンドラインからバイナリを呼び出す必要なく戻り値を確認できます。ご自由にConfig::newやrun関数の機能のテストは、 ご自身でお書きください。

  • こういう勉強のときに自由にっていわれるのが一番困るんだよな...

  • TDD、概要は結構理解したつもりだけども、実践ができていなかったからここで学べるの助かる

実際にクエリ文字列の検索を行う機能の実装をテスト駆動し、クエリに合致する行のリストを生成します。 この機能をsearchという関数に追加しましょう。

  • たしかに、分割しかしていなかったから機能の実装をしきれていなかった
#[cfg(test)]
mod test {
    use super::*;

    #[test]
    fn one_result() {
        let query = "duct";
        // Rustは
        // 安全で速く生産性も高い。
        // 3つ選んで。
        let contents = "\
Rust:
safe, fast, productive.
Pick three.";

        assert_eq!(vec!["safe, fast, productive."], search(query, contents));
    }
}
  • このテストを写経した

  • 予測してsearchを作ってみるか

  • たぶんこう

fn search (query: &str, contents: &str) -> result: vec![String]{

}
  • これで要件は満たせていて、ロジックがない状態のはず

  • 答えはこうだった

pub fn search<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    vec![]
}
  • なにーーーーーーーーーーーーーー

  • 戻り値は理解できる

  • ライフタイム絶対必要なのか、なんで

  • なんでここにライフタイムが必要か理解できなくてgeminiに聞いている

  • 必ず必要。。。?

  • ダングリングポインタになるから

    • まあそれはそうなんだけど
  • あーもしかしてこのsearchの戻り値はVecの参照を返しているからか

  • あーーーーーーーーーーーーーーーーーーーーーーーー

  • Vecって参照の塊ってどっかでやったわ

  • それだあああああああああああああ

  • 他ならmoveするが、この場合は参照なので必ずライフタイムがないとダングリングポインタするわ

  • geminiに指摘された

    • Vec自体はmoveするけど、中身は参照の塊ってことだよ
    • だからVecが生きていたところで中身の参照がダングリングするのでライフタイムを合わせる必要がある
  • 理解してきた

  • ちょいちょい記法が間違えていたので修正して今日は終了

今日の疑問

#
  • 間違えたVec<String>ってどこのタイミングで使うんだろうね

まとめ

#
  • 実際に速さを求めずじっくりやることによってTDDやVecへの理解が深まった気がする
  • 記法は盛大に間違えていたが、それを修正したことでどこを間違えたか理解ができた
  • 頭で理解するのと違うな~~

つぎはここ
NO IMAGEテスト駆動開発でライブラリの機能を開発する - The Rust Programming Language 日本語版