目次

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

(更新: )ぎじゅつ

はじめに

#

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

  • 今日は盛大に寝坊したり絶好調ではなかった、無念
  • 短めにしよう

お勉強

#

メモ

#

NO IMAGE環境変数を取り扱う - The Rust Programming Language 日本語版

  • ここをやる
  • 予測したメソッドは合っていそうだ
  • 大文字無視の話で特殊な実装すると思ったら&str.to_lowercase();ってメソッドあって一発で終わった
running 2 tests
test test::case_sensitive ... ok
test test::case_insensitive ... ok

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

     Running unittests src/main.rs (target/debug/deps/minigrep-4e5fb45b28b73439)

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s

   Doc-tests minigrep

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignore
  • よし、こんな感じかなって書けたし、怒られたところもスっと直せた
pub fn search_case_insensitive<'a>(query: &str, contents: &'a str) -> Vec<&'a str> {
    let query = query.to_lowercase();
    let mut results = Vec::new();

    for line in contents.lines() {
        if line.to_lowercase().contains(&query) {
            results.push(line);
        }
    }

    results
}
  • そういえば let queryってmutだから定義できるんだろうか
  • 引数でも持っていて、ここでも再定義していて気持ちがわるい
pub fn run(config: Config) -> Result<(), Box<Error>> {
    let mut f = File::open(config.filename)?;

    let mut contents = String::new();
    f.read_to_string(&mut contents)?;

    let results = if config.case_sensitive {
        search(&config.query, &contents)
    } else {
        search_case_insensitive(&config.query, &contents)
    };

    for line in results {
        println!("{}", line);
    }

    Ok(())
}
  • こんな実装だったが、let resultsが式で定義できるのめっちゃいいな
  • これがif式の恩恵って感じられた
 cargo run to poem.txt
   Compiling minigrep v0.1.0 (/Users/ryu.aizawa/Repo/minigrep)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.40s
     Running `target/debug/minigrep to poem.txt`
Are you nobody, too?
How dreary to be somebody!
 CASE_INSENSITIVE=1 cargo run to poem.txt
   Compiling minigrep v0.1.0 (/Users/ryu.aizawa/Repo/minigrep)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.19s
     Running `target/debug/minigrep to poem.txt`
Are you nobody, too?
How dreary to be somebody!
To tell your name the livelong day
To an admiring bog!
  • できた

  • 余談だがPowerShellについても言及されていておもしろかった

$ $env:CASE_INSENSITIVE=1
$ cargo run to poem.txt

まとめ

#
  • だいたいこんな感じでしょって簡単な実装はできるようになってきた
  • 式便利
  • 今日中に全部終わりたかったけど駄目だった、くやしい

次はここ

NO IMAGE標準出力ではなく標準エラーにエラーメッセージを書き込む - The Rust Programming Language 日本語版