scala - 在 Scala 中构建配置 DSL

标签 scala configuration code-generation typesafe

我想开启类型安全配置

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/

相关文章:

scala - Spark 结构化流 未授权访问组

vim - 如何将 Vim 状态栏从下移到上?

javascript - 在函数式编程中处理用户配置

c++ - 在 C++ 中使用 JVM 生成代码

scala - 处理宏注释时无法访问父级成员

scala - 为什么要寻找字符串?

scala - 将函数作为参数传递,为什么在我的场景中需要 => 符号?

java - 如何找到 Play Framework 应用程序的绝对路径?

sql-server-2005 - 远程连接需要 Sql Server 代理吗?

javascript - 从 ES6 javascript 中的字符串动态创建方法(非浏览器)