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.");
}
この見た目のプログレスバーがいい感じ。
画像ちっさい。。。
あんまり標準入力使ったことないし~、ってことで paiza ラーニングでやってみた。
単一行はなんとなく stdin
からなんかするんだよなぁ程度にわかっていた。
fn main(){
let mut buffer = String::new();
if let Ok(_) = std::io::stdin().read_line(&mut buffer) {
println!("{}", buffer);
}
}
しかし、複数行まったくわからんかった。下記を読んでその下のコードにたどり着く、
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 ラーニング。
cargo test
して 60 分超えるようなテストコードは #[ignore]
付けといて、普段は走らせず編集箇所に関係が有るときに走らせると気分がいいかもしれない。