[英]How to code this configuration logic in Scala?
這是我上一個問題的后續行動
假設我使用以下邏輯(在准Java中)來獲取配置參數MyParam
:
String myParam = null if ((myParam = getFromArgs("MyParam")) != null) return myParam if ((myParam = getFromSystemProperties("MyParam")) != null) return myParam if ((myParam = getFromUserConfigFile("MyParam")) != null) return myParam ... // and so on if (myParam == null) error("No MyParam")
如何在Scala中編寫此邏輯? Applicative
適用於此嗎?
List(getFromArgs _, getFromSystemProperties _, getFromUserConfigFile _).map{func=>
Option(func("MyParam"))
}.reduce(_ orElse _).getOrElse(sys.error("No MyParam"))
結帳scala選項cheatsheet 。 選項很強大。
如果你的問題只是語法問題,那么謝飛答案是准確的。
如果您真的在尋找靈活的配置,我建議您熱烈關注Typesafe配置項目: https : //github.com/typesafehub/config/
(
Option(getFromArgs("MyParam")) orElse
Option(getFromSystemProperties("MyParam")) orElse
Option(getFromUserConfigFile("MyParam")) getOrElse
error("No MyParam")
)
正如我在上面的評論中所指出的,您可以使用Option
的“First”monoid實例(實際上您只需要一個半群)來執行此操作 - 例如,使用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
調用)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.