我想开启类型安全配置
root {
mainA = "test"
submodule {
paramA = "value"
paramB = "value"
}
anotherModule {
zoo = 1
sub {
z = test
}
}
}
进入某种 Scala 配置对象,例如
object config {
val cfg = ConfigFactory.load()
val root = "root"
lazy val mainA = cfg.getString("root.mainA")
object submodule {
lazy val paramA = cfg.getString("root.submodule.paramA","value")
lazy val paramB = cfg.getString("root.submodule.paramB","value")
}
object anotherModule {
lazy val zoo = cfg.getInt("root.anotherModule.zoo",1)
object sub {
lazy val z = cfg.getString("root.anotherModule.sub.z","test")
}
}
}
所以一般来说我会有一些"template"配置文件,并生成“通用” 具有一些默认值的配置对象。
在 Haskell 中,我将使用 Template Haskell 来生成和编译代码, 在 Scala 中我该怎么办?
最佳答案
如果您希望有一种便捷的方式从 Scala 代码中使用配置,您可以尝试使用Dynamic
祖先来访问配置。像这样的东西:
class RichConfig(cfg:Config) extends Dynamic {
private val `intClassTag` = implicitly[ClassTag[Int]]
def selectDynamic[T](fieldName:String)(implicit ct:ClassTag[T]) =
ct match {
case `intClassTag` =>
cfg.getInt(fieldName)
}
}
当然,它不会为您提供运行时检查配置项是否存在的功能。
关于scala - 在 Scala 中构建配置 DSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18215264/