1

C の使用方法をエミュレートする方法を探していますgetopt。docopt を使用して、次の C スニペットを Rust に変換したいと考えています。コマンドライン引数にフラグを渡すことができないようです:

char in;
char* stringName;
while(( in = getopt( argc, argv, "a:b:c:d:e:")) != EOF) {
    switch(in) {
        case 'a':
            stringName = optarg;
            break;
     // ... and so on

それなら走りたい

cargo run -a "hello" -b 3 ... and so on

私はこれまでこれを書いてきました:

extern crate rustc_serialize;
extern crate docopt;

use docopt::Docopt;

// Define a USAGE string
const USAGE: &'static str = "
Program.

Usage: [options] [<value1>] [options] [<value2>] [options] [<value3>] [options] [<value4>]

Options:
    -a, 
    -b, 
    -c,
    -d,  
";

#[derive(Debug, RustcDecodable)]
struct Args {
    arg_value1: Option<String>,
    flag_a: bool,
    flag_b: bool,
    flag_c: bool,
    arg_value2: Option<String>,
    arg_value3: Option<String>,
    arg_value4: Option<String>,
}

fn main() {
    let args: Args = Docopt::new(USAGE)
                            .and_then(|d| d.decode())
                            .unwrap_or_else(|e| e.exit());
    println!("{:?}", args);
}

cargo run私が得たとき

不明なフラグ -a

4

1 に答える 1

1

このようなものは、あなたをかなり近づける可能性があります:

const USAGE: &'static str = "
Program.

Usage: program [options]

Options:
    -a VALUE
    -b VALUE
    -c VALUE
    -d VALUE
";

#[derive(Debug, RustcDecodable)]
struct Args {
    flag_a: Option<String>,
    flag_b: Option<i32>,
    flag_c: Option<String>,
    flag_d: Option<String>,
}

で実行するとcargo run -- -a "hello" -b 3(以下の注を参照)、出力は次のようになります。

Args { flag_a: Some("hello"), flag_b: Some(3), flag_c: None, flag_d: None }

その後、パターン マッチを実行flag_aして、それが提供されたかどうかを確認できます (したがって、値を取得できます)。個別のブール値フラグを持つ必要はありませんOption。この場合ははるかに優れています。


Vladimir Matveev が指摘しているように、 を介してプログラムを実行する場合、プログラムへのcargo run引数と引数を区別する必要がありcargoます。これを行うほとんどの (すべての?) プログラムは、特別なフラグを使用して行います--。これにより、プログラム間の引数が分離されます。プログラムをビルドした直後に実行することもできます。

$ cargo build
$ ./target/debug/program_name -a "hello" -b 3 
于 2016-04-13T12:46:08.330 に答える