Note

Rustでコマンドライン引数を受け取る

こちらの続きです。コマンドラインで引数を受け取って、それによって表示を切り分けるようなものを作ってみました。色々考慮足りないですが、とりあえず動かすです。

https://note.katsumataryo.com/tech/2019/09/1452.html

code

use std::fs; use std::env; fn main() { let args: Vec<String> = env::args().collect(); let target_path:String; if args.len() > 1 { target_path = format!("./{}", &args[1]); } else { target_path = "./".to_string(); } let paths = fs::read_dir(target_path).unwrap(); for path in paths { println!("{}", path.unwrap().path().display()) } }

run

# 実際の状態 $ ls Cargo.lock Cargo.toml src target # 引数なし $ cargo run Compiling ls v0.1.0 (/Users/ryo/works/RYO/rust/ls) Finished dev [unoptimized + debuginfo] target(s) in 0.33s Running `target/debug/ls` ./Cargo.toml ./target ./Cargo.lock ./.gitignore ./.git ./src # 引数があり $ cargo run src Finished dev [unoptimized + debuginfo] target(s) in 0.00s Running `target/debug/ls src` ./src/main.rs # 前のディレクトリも一応見える(見え方の良し悪しはさておき) $ cargo run ../ Finished dev [unoptimized + debuginfo] target(s) in 0.00s Running `target/debug/ls ../` ./../ls # 以下は例外になってるのでどうにかしたい # ファイルだった場合 $ cargo run src/main.rs Finished dev [unoptimized + debuginfo] target(s) in 0.00s Running `target/debug/ls src/main.rs` thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Os { code: 20, kind: Other, message: "Not a directory" }', src/libcore/result.rs:1084:5 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace. # 存在しないディレクトリ $ cargo run noexist Finished dev [unoptimized + debuginfo] target(s) in 0.00s Running `target/debug/ls noexist` thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Os { code: 2, kind: NotFound, message: "No such file or directory" }', src/libcore/result.rs:1084:5 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace.

memo

のちほどメモするけど、例外を次はキャッチしてどうにかするみたいなものをやってみると良さそうかな。

  • コマンドライン引数は env::args() でとってる。そのあと collect()してる
  • Vecは1つ目の要素に実行ファイル名が入ってる
  • Vecのサイズは.len()で取れる
  • 文字列の変数展開は format!("{}", variable) でよさそうだけどいいのだろうか

コマンドラインから色々見ていくの覚えることがちょっとずつ勉強になっていいかもしれない。