2012-03-27 6 views
2

Scala scopt 2.0.1ライブラリに新しい不変OptionParserを使用しようとしています。 OptionParserは、ジェネリック型を取り、ヘルプメソッドがすでにUnitを返すアクションを定義するので、私は、コンパイル時エラーを取得しています:不変SCOPT(Scala)OptionParser(2.0.1)の "help"メソッドの使用

case class Config(directory: String = null) 

val parser = new OptionParser[Config]() { 
    def options = Seq(
    opt("d", "directory", "directory containing the files to be processed") { 
     (value: String, config: Config) => config.copy(directory = value) 
    }, 
    help("?", "help", "Show a usage message and exit")) 
} 

error: type mismatch; 
[INFO] found : scopt.generic.FlagOptionDefinition[Nothing] 
[INFO] required: scopt.generic.OptionDefinition[Config] 
[INFO] Note: Nothing <: Config, but class OptionDefinition is invariant in type C. 

は、どのように私は、「ヘルプ」オプションを含めることができますか?

答えて

2

最初に、ライブラリーにエラーがあると思われます。オーバーロードされたメソッドoptの1つは、タイプパラメータCですが、少なくとも私が知ることはできません。それはちょうどクラスからCを取る必要があります。とにかく、あなたはその呼び出しを使用しますが、私はScalaがこのCがクラスのCConfig)と同じであることを正しく推測していると思います。そのaction: => C実装が{this.showUsage; exit}あるので、それはあなたにFlagOptionDefinition[Nothing]を与える -

問題はhelpが完全に役に立たないということのようです。

私はあなたがC型パラメータを強制し、独自のhelp方法書くことができ

... OptionParserクラスが固定必要があると思う:

def help2(shortopt: String, longopt: String, description: String) = 
    new FlagOptionDefinition[C](Some(shortopt), longopt, description, 
    { this.showUsage; exit }) 
関連する問題