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) でよさそうだけどいいのだろうか

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