Open9

Rust 備忘録

えっつえっつ
pub struct Data {
    pub records: Vec<Vec<String>>,
    hash_records: HashSet<Vec<String>>,
}

impl Data {
    pub fn new() -> Self {
        Self {
            records: Vec::<Vec<String>>::new(),
            hash_records: HashSet::<Vec<String>>::new(),
        }
    }
    pub fn add_records(&mut self, record: Vec<String>) {
        // 先頭要素を無視して HashSet に登録することでレコードのユニークを維持
        if self
            .hash_records
            .insert(record.split_first().unwrap().1.to_vec())
        {
            self.records.push(record);
        }
    }
}

動的に変化する 2 次元データを扱うとき、1 レコードの先頭になんかデータを付与して使いたい。しかし、付与データ以外の部分でユニークにはしたい。そんなわがまましたいときは上述にする。

HashSet はユニーク検査用、Vec が実際に使うデータとなる。

for ループするより HashSet を上手く使った方が早かった、全部見ないでそこじゃってやってるからそりゃそうなんだけど。見ないといけないねーってなると for ループ使いがち……。

えっつえっつ
fn check_and_create_directory(path: &PathBuf) {
    let dir = if path.extension().is_some() {
        path.with_file_name("").with_extension("")
    } else {
        path.to_path_buf()
    };

    if !dir.exists() {
        if let Err(e) = std::fs::create_dir_all(dir) {
            panic!("Error: ディレクトリ作成でエラー\n{}", e);
        }
    }
}

path.is_file() はファイル名そのものじゃないとダメっぽい。
path.extension().is_some() とするとファイル名を含むかもしれないパスでファイル名が有るかちゃんと検査できた。

えっつえっつ
fn any_function() {
  let vec: Vec<i32> = vec![10; 10];
  let pb = indicatif::ProgressBar::new(vec.len());
  pb.set_style(
      indicatif::ProgressStyle::with_template(
          "[{elapsed_precise}] {wide_bar:.cyan/blue} {pos:>7}/{len:7} {msg}",
      )
      .unwrap()
      .progress_chars("##-"),
  );

  for v in vec {
    std::thead::sleep(v);
    pb.inc(1);
  }

  pb.finish_with_message("suzaku data converted to dateone data.");
}

この見た目のプログレスバーがいい感じ。

example

https://docs.rs/indicatif/latest/indicatif/struct.ProgressBar.html

えっつえっつ

あんまり標準入力使ったことないし~、ってことで paiza ラーニングでやってみた。
単一行はなんとなく stdin からなんかするんだよなぁ程度にわかっていた。

fn main(){
  let mut buffer = String::new();
  if let Ok(_) = std::io::stdin().read_line(&mut buffer) {
    println!("{}", buffer);
  }
}

しかし、複数行まったくわからんかった。下記を読んでその下のコードにたどり着く、

https://doc.rust-lang.org/std/io/struct.StdinLock.html

use std::io::BufRead;
fn main(){
  let stdin = std::io::stdin();
  let mut stdinlock = stdin.lock();
  let lines = stdinlock.lines();
  
  for line in lines {
    if let Ok(buffer) = line {
      println!("{}", buffer);
    }
  }
}

標準入力確保して、それをロックして、全行取得!とやる必要があるみたい。
あと、この際に std::io::BufRead を内部で使うので use しておく。

説いた問題は下記。学びなおしや別言語入門時にはいいよね、paiza ラーニング。

https://paiza.jp/works/mondai/stdin_primer/stdin_primer__read_line_step1
https://paiza.jp/works/mondai/stdin_primer/stdin_primer__read_line_step2

えっつえっつ

上記 12 ヶ月プランの話だった、1ヶ月プランは月 1,078 円。
それでも書いて学びたいだけなのに課題を発想する必要があるのと比べたら、そこに有るもので学べるし有りかも。

えっつえっつ

1ヶ月プランにしてみた、コーディングしたいけど対象が思いつかないときに便利

えっつえっつ

cargo test して 60 分超えるようなテストコードは #[ignore] 付けといて、普段は走らせず編集箇所に関係が有るときに走らせると気分がいいかもしれない。