Значение ()
является экземпляром единицы, поэтому с этим нужно справиться:
def execute(
goals: List[String],
profiles: List[String] = Nil,
loggingCallback: (String) => Unit = { _ => () }): Result =
{
// method body
loggingCallback("a message")
// do something returning a Result
}
update
Если что-то необязательно, то оночасто имеет смысл более явно заявить об этом, это также приводит к лучшему самодокументированному коду:
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
}
update 2
Подобные DSL-ситуации такжеодна из немногих ситуаций, когда я потворствую использованию 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
}
Обратите внимание: Option(loggingCallback)
до немедленно преобразует обнуляемый loggingCallback
вхороший тип-safe Option
, затем getOrElse
, чтобы обеспечить запасную альтернативу.