4

默认情况下,布尔字段设置为false,但我希望它true默认设置为。

我试图[default: true]docopt描述中使用,但它似乎default不能应用于布尔选项。我也尝试使用 Rust 的Default特性——它也不起作用。

以下是一个最小示例:

extern crate rustc_serialize;
extern crate docopt;

use docopt::Docopt;

const USAGE: &'static str = "
Hello World. 

Usage:
  helloworld [options]

Options:
  --an-option-with-default-true   This option should by default be true
";

#[derive(Debug, RustcDecodable)]
struct Args {
    flag_an_option_with_default_true: bool,
}

impl Args {
    pub fn init(str: &str) -> Args {
        Docopt::new(USAGE)
            .and_then(|d| d.argv(str.split_whitespace().into_iter()).parse())
            .unwrap_or_else(|e| e.exit())
            .decode()
            .unwrap()
    }
}
4

2 回答 2

1

crate的作者说这是不可能的,所以这是您可以获得的答案的权威。


作为替代方案,您可以采用默认为“true”的参数:

const USAGE: &'static str = "
Hello World. 

Usage:
  helloworld [options]

Options:
  --an-option=<arg>   This option should by default be true [default: true].
";

#[derive(Debug, RustcDecodable)]
struct Args {
    flag_an_option: String,
}

impl Args {
    // ...

    fn an_option(&self) -> bool {
        self.flag_an_option == "true"
    }
}

fn main() {
    let a = Args::init("dummy");
    println!("{}", a.an_option()); // true

    let a = Args::init("dummy --an-option=false");
    println!("{}", a.an_option()); // false

    let a = Args::init("dummy --an-option=true");
    println!("{}", a.an_option()); // true
}

或者你可以有一个具有逆逻辑的标志:

const USAGE: &'static str = "
Hello World. 

Usage:
  helloworld [options]

Options:
  --disable-an-option
";

#[derive(Debug, RustcDecodable)]
struct Args {
    flag_disable_an_option: bool,
}

impl Args {
    // ... 

    fn an_option(&self) -> bool {
        !self.flag_disable_an_option
    }
}

fn main() {
    let a = Args::init("dummy");
    println!("{}", a.an_option()); // true

    let a = Args::init("dummy --disable-an-option");
    println!("{}", a.an_option()); // false
}

请记住,您可以在已解析的参数结构上实现方法,使其更易于处理。

于 2017-03-15T19:52:21.330 回答
1

不。

Docopt 本身不提供“禁用”标志的方法,因此如果标志默认为 true ——即使最终用户没有给出它——那么该标志就不可能永远是false.

于 2017-03-15T14:28:42.963 回答