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
。
编辑:由于 App
将 args
可见性定义为 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")
}
我有一个扩展 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
。
编辑:由于 App
将 args
可见性定义为 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")
}