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 回答