Scala:使用App特征

pfe*_*rel 0 scala scala-2.10

我有一个扩展App的应用程序和一个实现选项解析器的特性.所有特征需求是运行时混合中的某些类或特性提供:

val args: Array[String]
Run Code Online (Sandbox Code Playgroud)

如果我宣布:

trait OptionParser extends App {...}
Run Code Online (Sandbox Code Playgroud)

一切都很好,但排除了选项解析器的任何其他用途,而不是App对象.不确定应用程序扩展App以及混合使用OptionParser是否效率低下:

object MyApp extends App with OptionParser {...}
Run Code Online (Sandbox Code Playgroud)

我意识到这可以缩短为:

object MyApp extends OptionParser {...}
Run Code Online (Sandbox Code Playgroud)

但理想情况下,我希望OptionParser完全独立,除非依赖于 args提供,这只是因为这是App放置它们的地方.

是否有某种方法来声明依赖项而不提供类或特征来从中获取它?可以在链接时检测到错误,以免破坏类型安全性.

vpt*_*ron 6

不确定我到底知道你要做什么.那个怎么样:

trait OptionParser {
  protected def args: Array[String]

}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以OptionParser将任何提供的东西混合args,而不一定App.

编辑:因为您也需要App定义args可见性.这很不幸.这是另一个想法:protectedOptionParser

trait OptionParser {def options: Array[String] ... }
Run Code Online (Sandbox Code Playgroud)

对象MyApp使用OptionParser扩展App {def options = args ...}