使用docopt和Rust解析带有参数的命令行标志,类似于getopt

使用docopt和Rust解析带有参数的命令行标志,类似于getopt,rust,docopt,Rust,Docopt,我正在寻找一种方法来模拟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; // ..

我正在寻找一种方法来模拟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);
}
extern板条箱生锈序列化;
外部板条箱docopt;
使用docopt::docopt;
//定义用法字符串
常量用法:&'static str='
节目。
用法:[options][][options][][options][][[options][]
选项:
-a,,
-b,,
-c,
-d,
";
#[派生(调试,可恢复)]
结构参数{
参数值1:选项,
旗帜a:布尔,
旗帜b:布尔,
国旗c:布尔,
参数值2:选项,
参数值3:选项,
参数值4:选项,
}
fn main(){
让args:args=Docopt::new(用法)
然后(| d | d.decode())
.打开包装或其他(| e | e.退出());
println!(“{:?}”,args);
}
当我
货物运行时
我得到

未知标志-a


类似这样的事情可能会让你非常接近:

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>,
}
然后,您可以在
标记a
上进行模式匹配,以判断是否提供了它(从而获得值)。不需要有单独的布尔标志,在这种情况下,
选项
更好


同样,当您通过
cargo run
执行程序时,必须将
cargo
的参数与程序的参数区分开来。大多数(所有?)执行此操作的程序都使用特殊标志
--
。这将分离程序之间的参数。您也可以在程序生成后直接运行该程序:

$cargo build
$./target/debug/program\u name-a“hello”-b 3

请显示您尝试过的代码以及您遇到的问题it@ker我已经把它添加到编辑中了我不认为你的docopt规范做了你认为它做的事情。您如何知道为哪个值设置了哪个标志?您得到的
Args
结构对于
program-a“hi”-b2
program-b“hi”-a2
具有相同的值。好的,我知道它有什么问题。但是,还有另一个问题。您提到您使用的是
货物运输
,对吗?为了让它正确地将参数传递给程序,您需要在双破折号后指定它们,如下所示:
cargo run--a“hi”-b2
。否则,
cargo run
将无法决定哪些选项指向自身,哪些选项指向程序。但无论如何,@ker的担忧是绝对正确的。坦率地说,我不确定解析库中是否有任何参数可以满足您的要求(最多四个参数,每个参数有不同的标志)。您可能需要自己实现解析。这是非常有用的。因此,无论何时解析使用标志的命令行参数,都必须始终使用--作为第一个命令行参数?@BumptheTrump不,这不太正确。我加了一张便条。
Args { flag_a: Some("hello"), flag_b: Some(3), flag_c: None, flag_d: None }