Rustでコマンドライン引数を受け取る
Categories: TECHNOLOGY
こちらの続きです。コマンドラインで引数を受け取って、それによって表示を切り分けるようなものを作ってみました。色々考慮足りないですが、とりあえず動かすです。
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)
でよさそうだけどいいのだろうか コマンドラインから色々見ていくの覚えることがちょっとずつ勉強になっていいかもしれない。