【问题标题】:Building configuration DSL in Scala在 Scala 中构建配置 DSL
【发布时间】:2013-08-15 10:24:14
【问题描述】:

我要转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")
    }
  }
}

所以一般我会有一些“模板”配置文件,并生成“通用” 具有一些默认值的配置对象。

在 Haskell 中,我会使用 Template Haskell 来生成和编译代码, 在 Scala 中我能做些什么呢?

【问题讨论】:

  • 您可以使用 Scala 2.10 的 def 宏来实现类型提供程序之类的东西,但这有点棘手(有关示例和讨论,请参阅我的博客文章 herehere)。一旦我们有了macro annotations,这将变得容易得多。

标签: scala configuration code-generation typesafe


【解决方案1】:

如果您希望通过 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)
    }
}

当然,它不会让您在运行时检查配置项是否存在。

【讨论】:

    猜你喜欢
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多