Scala:使用 App 特性

Scala: Using the App trait

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

val args: Array[String]

如果我声明:

trait OptionParser extends App {...}

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

object MyApp extends App with OptionParser {...}

我意识到这可以缩短为:

object MyApp extends OptionParser {...}

但理想情况下,我想让 OptionParser 完全独立,除了依赖 args 提供,这只是因为那是应用程序放置它们的地方。

有没有什么方法可以在不提供 class 或特征的情况下声明依赖关系?可以在 link 时间检测到错误,以免破坏类型安全。

不确定我是否完全理解您的意图。怎么样:

trait OptionParser {
  protected def args: Array[String]

}

通过这种方式,您可以将 OptionParser 与任何提供 args 的东西混合使用,而不必 App

编辑:由于 Appargs 可见性定义为 protected,您也需要在 OptionParser 中执行此操作。这很不幸。这是另一个想法:

trait OptionParser {def options: Array[String] ... }

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

您可以通过 OptionParser 上的自我类型声明来做到这一点。这将要求混入 OptionParser 的类型成为 App,而不混入 App 本身。

trait OptionParser { this: App =>

    def test(): Unit = {
        println("test")
        println(args)
    }

}

object Test extends App with OptionParser {
    test()
    println("done")
}