サーチ…


前書き

Rustの標準ライブラリには適切な引数パーサ(Pythonのargparseとは異なります)が含まれておらず、代わりにサードパーティのクレートに残すことをお勧めします。これらの例では、標準ライブラリ(粗引き数ハンドラを形成する)と、コマンドライン引数をより効果的に解析できるclapライブラリの両方の使用法を示します。

構文

  • std :: envを使用します。 // envモジュールをインポートする
  • let args = env :: args(); // Argsイテレータをargs変数に格納します。

std :: env :: args()を使用する

プログラムに渡されるコマンドライン引数には、 std::env::args()関数を使用してアクセスできます。これはループしたりVec集めることができるArgsイテレータを返します。

引数を反復する

use std::env;

fn main() {
    for argument in env::args() {
        if argument == "--help" {
            println!("You passed --help as one of the arguments!");
        }
    }
}

Vecへの収集

use std::env;

fn main() {
    let arguments: Vec<String> = env::args().collect();
    println!("{} arguments passed", arguments.len());
}

次のようにプログラムを呼び出すと、予想以上に多くの引数が得られる可能性があります。

./example

引数が渡されなかったように見えますが、最初の引数は( 通常 )実行可能ファイルの名前です。しかしこれは保証ではありませんので、取得した引数を常に検証してフィルタリングする必要があります。

拍手を使う

より大きなコマンドラインプログラムでは、 std::env::args()は非常に面倒で管理が難しいです。 clapを使用clapと、コマンドラインインターフェイスを処理できます。コマンドラインインターフェイスは、引数を解析し、ヘルプを表示し、バグを回避します。

あなたはclapで使うことができるいくつかのパターンがあり、それぞれが異なる量の柔軟性を提供します。

ビルダーパターン

これは最も冗長で柔軟な方法であるため、CLIのきめ細かな制御が必要な場合に便利です。

clapサブコマンド引数を区別します 。サブコマンドは、 cargo rungit pushと同様に、メインプログラムの独立したサブプログラムのように動作します。彼らは、独自のコマンドラインオプションと入力を持つことができます。引数は--verboseような単純なフラグで、入力を受け取ることができます(例えば - --message "Hello, world"

extern crate clap;
use clap::{Arg, App, SubCommand};

fn main() {
    let app = App::new("Foo Server")
        .about("Serves foos to the world!")
        .version("v0.1.0")
        .author("Foo (@Example on GitHub)")
        .subcommand(SubCommand::with_name("run")
            .about("Runs the Foo Server")
            .arg(Arg::with_name("debug")
                .short("D")
                .about("Sends debug foos instead of normal foos.")))

    // This parses the command-line arguments for use.
    let matches = app.get_matches();

    // We can get the subcommand used with matches.subcommand(), which
    // returns a tuple of (&str, Option<ArgMatches>) where the &str
    // is the name of the subcommand, and the ArgMatches is an 
    // ArgMatches struct: 
    // https://docs.rs/clap/2.13.0/clap/struct.ArgMatches.html

    if let ("run", Some(run_matches)) = app.subcommand() {
        println!("Run was used!");
    }
}


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow