3

这是我之前的问题的后续

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

字符串 myParam = null

if ((myParam = getFromArgs("MyParam")) != null)
   返回我的参数

if ((myParam = getFromSystemProperties("MyParam")) != null)
   返回我的参数

if ((myParam = getFromUserConfigFile("MyParam")) != null)
   返回我的参数

... // 等等

如果(myParam == null)
   错误(“没有我的参数”)

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

4

4 回答 4

8
List(getFromArgs _, getFromSystemProperties _, getFromUserConfigFile _).map{func=>
  Option(func("MyParam"))
}.reduce(_ orElse _).getOrElse(sys.error("No MyParam"))

结帐scala 选项备忘单。选项很强大。

于 2012-07-11T15:26:39.847 回答
5

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

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

于 2012-07-11T15:44:45.043 回答
3
(
  Option(getFromArgs("MyParam")) orElse
  Option(getFromSystemProperties("MyParam")) orElse
  Option(getFromUserConfigFile("MyParam")) getOrElse
  error("No MyParam")
)
于 2012-07-11T21:48:16.673 回答
2

正如我在上面的评论中所指出的,您可以使用“第一个”幺半群实例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如果不需要它们就不会发生调用)。

于 2012-07-11T16:25:27.503 回答