質問: ひょんな事から、自作ポートスキャナを書く必要に迫られたので、これをスキルアップの単位点とし、自作を始めることにしました。そこで目に止まったのが`clap`です。 ### 問題 `clap`を使い始めまず最初に目に留まったのが、ほとんどが引数ベースの処理を提供しているという事です。つまり ``` $ scanner -i 120.0.0.1 ``` と言った処理をすることが前提となっているように個人的には思えました。 そこで、 ``` $ scanner 120.0.0.1 ``` との形でコマンドに直接引数を渡す事を想定した場合、どのような記述をすればよいのでしょうか? clap::Argを見てみても、それらしき関数は発見できませんでした(寝起きで見逃しているのか、元来英語が苦手だからかと思いますが)。 伺いたいことを纏めると、 * `clap::arg`を使って直接値を受け渡すにはどうすればよいのか? ### 備考 `std::env::arg`を使う方法もありますが、これを組み込むとプログラムが必要以上に複雑になってしまう可能性があるので、できれば`clap`で完結したいと思います。
回答: `long` や `short` などでオプション名を指定しない限り、clapの引数はポジショナルになります。 例えば以下のように書くことで、質問で要求された引数の取り方を実現できます。 ``` use clap::{App, Arg}; let a = App::new("scanner").arg( Arg::with_name("addr") .help("the address to scan") .required(true), ).get_matches(); let addr = a.value_of("addr").unwrap(); ``` clapのレポジトリに様々な使い方の例があるので、見てみるとよいでしょう。