簡體   English   中英

Scala空默認關閉?

[英]Scala empty default closure?

只是一個簡單的問題,我似乎無法找到答案。

我在Scala中有一個方法定義,如下所示:

def execute(goals: List[String],
            profiles: List[String] = List(),
            loggingCallback: (String) => Unit = { _ => }): Result = {
    // method body
    loggingCallback("a message")
}

我想知道是否有更好的方法來指定默認的空閉包。 問題不在於如何實現日志記錄,這只是一個例子。

你的解決方案很好。 你可以為Function1[X, Unit]引入一個類型別名; 按照Kevin的回答使用() ,並刪除不必要的parens。

scala> type Effect[-A] = (A => Unit)
defined type alias Effect

scala> def foo(f: Effect[String] = _ => ()) = ()
foo: (f: (String) => Unit)Unit

您還可以定義一個noop函數:

scala> val noop = (a: Any) => ()
noop: (Any) => Unit = <function1>

scala> def foo(f: Effect[String] = noop) = ()

value ()是unit的一個實例,所以這應該可以解決問題:

def execute(
  goals: List[String],
  profiles: List[String] = Nil,
  loggingCallback: (String) => Unit = { _ => () }): Result =
{
  // method body
  loggingCallback("a message")
  // do something returning a Result
}

更新

如果某些東西是可選的,那么明確說明通常更有意義,這也會產生更好的自我記錄代碼:

def execute(
  goals: List[String],
  profiles: List[String] = Nil,
  loggingCallback: Option[(String) => Unit] = None): Result =
{
  // method body
  loggingCallback forEach { _.apply("a message") }
  // do something returning a Result
}

更新2

像這樣的DSL-esque情況也是我在Scala中寬恕使用null的極少數情況之一:

def execute(
  goals: List[String],
  profiles: List[String] = Nil,
  loggingCallback: (String) => Unit = null
): Result = {
  // method body
  val log = Option(loggingCallback) getOrElse {_ => ()}
  log("a message")
  // do something returning a Result
}

注意Option(loggingCallback) 立即將可空的loggingCallback轉換為一個很好的類型安全的Option ,然后getOrElse來提供一個后備替代。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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