Scala空默认关闭?

And*_*ele 13 closures scala default-value

只是一个简单的问题,我似乎无法找到答案.

我在Scala中有一个方法定义,如下所示:

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

我想知道是否有更好的方法来指定默认的空闭包.问题不在于如何实现日志记录,这只是一个例子.

ret*_*nym 15

你的解决方案很好.您可以为...引入类型别名Function1[X, Unit]; 使用()按照凯文的回答,和丢弃不必要的括号.

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

scala> def foo(f: Effect[String] = _ => ()) = ()
foo: (f: (String) => Unit)Unit
Run Code Online (Sandbox Code Playgroud)

您还可以定义一个noop函数:

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

scala> def foo(f: Effect[String] = noop) = ()
Run Code Online (Sandbox Code Playgroud)


Kev*_*ght 6

该值()是一个单元的实例,所以这应该做的伎俩:

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

更新

如果某些东西是可选的,那么明确说明通常更有意义,这也会产生更好的自我记录代码:

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
}
Run Code Online (Sandbox Code Playgroud)

更新2

像这样的DSL-esque情况也是我null在Scala中宽恕使用的极少数情况之一:

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
}
Run Code Online (Sandbox Code Playgroud)

请注意Option(loggingCallback),以立即转换可空loggingCallback成为一个很好的类型安全Option,然后getOrElse提供一个备用选择.