【发布时间】:2016-04-13 21:09:37
【问题描述】:
我正在寻找一种方法来模拟 C 如何使用 getopt。我想使用 docopt 将以下 C sn-p 转换为 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
【问题讨论】:
-
请显示您尝试过的代码以及您遇到的问题
-
@ker 我已将其添加到编辑中
-
我不认为你的 docopt 规范做你认为它做的事情。您怎么知道为哪个值设置了哪个标志?您获得的
Args结构对于program -a "hi" -b 2和program -b "hi" -a 2具有相同的值 -
@ker 好的,我知道它有什么问题。
-
然而,还有另一个问题。你提到你使用
cargo run,对吧?为了让它正确地将参数传递给程序,您需要在双破折号后指定它们,如下所示:cargo run -- -a "hi" -b 2。否则cargo run将无法决定哪些选项针对自身以及哪些针对程序。但无论如何,@ker 的担忧是绝对有道理的。坦率地说,我不确定是否有任何参数解析库可以做你想要的(最多四个参数,每个参数都有不同的标志)。您可能需要自己实现解析。