Я ищу способ подражать тому, как C использует getopt
. Я хочу преобразовать следующий фрагмент C в Rust с помощью docopt. Кажется, я не могу передавать флаги в аргумент командной строки:
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
Args
будет иметь одинаковые значения дляprogram -a "hi" -b 2
иprogram -b "hi" -a 2
- person oli_obk   schedule 13.04.2016cargo run
, верно? Чтобы он правильно передавал аргументы программе, вам необходимо указать их после двойного дефиса, например:cargo run -- -a "hi" -b 2
. В противном случаеcargo run
не сможет решить, какие параметры направлены на себя, а какие - на программу. Но, тем не менее, опасения @ker абсолютно справедливы. Честно говоря, я не уверен, могут ли библиотеки синтаксического анализа аргументов делать то, что вы хотите (до четырех аргументов, с разными флагами для каждого). Скорее всего, вам придется реализовать синтаксический анализ самостоятельно. - person Vladimir Matveev   schedule 13.04.2016