2012-03-27 2 views
2

Ich versuche, die neue unveränderliche OptionParser in der Scala scopt 2.0.1 Bibliothek zu verwenden. Da OptionParser nimmt einen generischen Typ und die Hilfemethode definiert bereits eine Aktion, die Unit zurückkehrt, ich bin ein Fehler bei der Kompilierung bekommen:Mit der "Hilfe" -Methode im unveränderlichen SCOPT (Scala) OptionParser (2.0.1)

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. 

Wie kann ich eine „Hilfe“ -Option enthalten?

Antwort

2

Zunächst scheint es einen Fehler in der Bibliothek zu geben, wo eine der überladenen Methoden von opt einen Typparameter C nimmt, den es nicht sollte - zumindest was ich sagen kann. Es sollte nur C aus der Klasse nehmen. Wie auch immer, obwohl Sie diesen Anruf verwenden, nehme ich an, dass Scala immer noch korrekt davon ausgeht, dass C dasselbe ist wie die Klasse C (Config).

Das Problem scheint zu sein, dass help völlig nutzlos ist - es gibt Ihnen FlagOptionDefinition[Nothing] weil seine action: => C Implementierung {this.showUsage; exit} ist.

Ich denke, dass die OptionParser Klasse Festsetzung braucht ...

Sie könnten Ihre eigene help Methode schreiben, die den C Typ-Parameter erzwingt:

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