0

ユーザーが docopt 文字列を提供するユース ケースがあり、それに基づいてコードを生成します。そのため、docopt 文字列が前もってわかりません。

特定の「引数の型」(データ型ではない) について、さまざまなコードを生成したいと考えています。

以下では、「型」と「データ型」を区別します。docopt 引数--arg=DEGREESと argv 入力--arg=10の「タイプ」--argDEGREESであり、データ型はintegerです。値は10です。

ユーザーから次の docopt 文字列が返されることがあります。

Naval Fate.

Usage:
  naval_fate --dir=FILE [--speed=ABC]

Options:
  --dir=FILE   Moored (anchored) mine.
  --speed=ABC  Speed in knots [default: 10].

いつものようにこの docopt 文字列を解析するだけでなく、引数の「タイプ」dirspeed要求を把握しようとしています。dirそれが typeFILEspeedあり、 type であることを知りたいですABC

例:

上記の docopt 文字列と argv 文字列が与えられた場合、値とデータ型 ( ) だけでなく、「構成タイプ」 ( 、つまり次の行に沿ったもの) にもnaval_fate --dir=/tmp --speed 1234アクセスしたいと考えています。<key> => <value,datatype><key> => <value,datatype,argtype>

dir=> 値: /tmp、データ型: String型:FILE
speed => 値: 1234、データ型: Integer型:ABC

docopt の任意の (管理された) 実装は、Python を含めて受け入れられますが、C、Go、Rust など、コンパイルされた言語でのソリューションを探していることが望ましいです。

4

1 に答える 1

1

これはRust の Docoptを使えばとても簡単です:

#![allow(unstable)]

extern crate docopt;

use docopt::Docopt;

static USAGE: &'static str = "
Naval Fate.

Usage:
    naval_fate ship --dir=FILE [--speed <kn>]
    naval_fate (-h | --help)

Options:
    -h --help     Show this screen.
    --speed <kn>  Speed in knots [default: 10].
    --dir=FILE    Moored (anchored) mine.
";

fn main() {
    let args = Docopt::new(USAGE)
                      .and_then(|d| d.parse())
                      .unwrap_or_else(|e| e.exit());
    println!("Type of 'ship': {:?}", args.find("ship"));
    println!("Type of '--dir': {:?}", args.find("--dir"));
    println!("Type of '--speed': {:?}", args.find("--speed"));
}

どの出力:

$ ./target/scratch ship --dir /tmp --speed 1234                                        
Type of 'ship': Some(Switch(true))                                                                       
Type of '--dir': Some(Plain(Some("/tmp")))                                                               
Type of '--speed': Some(Plain(Some("1234"))) 

重要なのは、 の戻り値の型が代数データ型であるということです: findhttp://burntsushi.net/rustdoc/docopt/enum.Value.html ---したがって、構築により、引数の「型」を取得します。無料で。Value

これは、引数リストに渡されなくても、Docopt 使用文字列内の任意の「引数」に対して機能することに注意してください。

于 2015-01-29T12:15:38.293 に答える