簡體   English   中英

如何在Scala中編寫此配置邏輯?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM