【问题标题】:How to code this configuration logic in Scala?如何在 Scala 中编写此配置逻辑?
【发布时间】:2012-07-11 15:09:56
【问题描述】:

这是我之前question的后续行动

假设我使用以下逻辑(在准Java中)获取配置参数MyParam

字符串 myParam = null if ((myParam = getFromArgs("MyParam")) != null) 返回我的参数 if ((myParam = getFromSystemProperties("MyParam")) != null) 返回我的参数 if ((myParam = getFromUserConfigFile("MyParam")) != null) 返回我的参数 ... // 等等 如果(myParam == null) 错误(“没有我的参数”)

如何在 Scala 中编写此逻辑? Applicative 在这里适用吗?

【问题讨论】:

  • 幺半群的想法可能比这里的应用程序更有用-xiefei 在下面的回答利用了OptionorElse 本质上是有时称为"First" monoid instance 的加号操作这一事实对于Option

标签: scala applicative


【解决方案1】:
List(getFromArgs _, getFromSystemProperties _, getFromUserConfigFile _).map{func=>
  Option(func("MyParam"))
}.reduce(_ orElse _).getOrElse(sys.error("No MyParam"))

结帐scala Option cheatsheet。选项很强大。

【讨论】:

    【解决方案2】:

    如果你的问题只是语法问题,xiefei的答案是准确的。

    如果您真的在寻找灵活的配置,我建议您热情地查看 Typesafe 配置项目:https://github.com/typesafehub/config/

    【讨论】:

      【解决方案3】:
      (
        Option(getFromArgs("MyParam")) orElse
        Option(getFromSystemProperties("MyParam")) orElse
        Option(getFromUserConfigFile("MyParam")) getOrElse
        error("No MyParam")
      )
      

      【讨论】:

        【解决方案4】:

        正如我在上面的评论中所指出的,您可以使用 Option 的“第一个”幺半群实例(实际上您只需要一个半群)来执行此操作 - 例如,使用 Scalaz

        import scalaz._, Scalaz._
        
        def fo[A](a: A) = Option(a).fst
        
        val param = (
          fo(myParam) |+|
          fo(getFromArgs("MyParam")) |+|
          fo(getFromSystemProperties("MyParam")) |+|
          fo(getFromUserConfigFile("MyParam"))
        ) getOrElse sys.error("No Param")
        

        它不一定比使用标准库的orElse 版本更可取,但它突出了相关的抽象(还要注意这个版本是惰性的——getX 调用如果不需要它们就不会发生)。

        【讨论】:

        • 谢谢。 Semigroup 看起来确实像一个相关的抽象。现在我想知道这种抽象如何在这个(或类似的)示例中实际帮助。
        猜你喜欢
        • 2012-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多