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

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

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

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

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください