只是一个简单的问题,我似乎无法找到答案。
我在Scala中有一个方法定义,如下所示:
def execute(goals: List[String],
profiles: List[String] = List(),
loggingCallback: (String) => Unit = { _ => }): Result = {
// method body
loggingCallback("a message")
}
我想知道是否有更好的方法来指定默认的空闭包。问题不在于如何实现日志记录,这只是一个例子。
答案 0 :(得分:15)
你的解决方案很好。您可以为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) = ()
答案 1 :(得分:6)
值()
是单位的实例,所以这应该可以解决问题:
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特有情况也是我在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
以提供备用替代方案