Scala пустое закрытие по умолчанию?
Просто быстрый вопрос. Кажется, я не могу найти ответ.
У меня есть определение метода в Scala, которое выглядит так:
def execute(goals: List[String],
profiles: List[String] = List(),
loggingCallback: (String) => Unit = { _ => }): Result = {
// method body
loggingCallback("a message")
}
Я хотел бы знать, есть ли лучший способ указать пустое закрытие по умолчанию. Вопрос не в том, как реализовать ведение журнала, это просто пример.
Ответы
Ответ 1
Ваше решение в порядке. Вы можете ввести псевдоним типа Function1[X, Unit]
; используйте ()
в соответствии с ответом Кевина и откажитесь от ненужных парнеров.
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) = ()
Ответ 2
Значение ()
- это экземпляр единицы, поэтому это должно сделать трюк:
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 также являются одной из очень немногих ситуаций, когда я потворствую использованию 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)
, чтобы немедленно преобразовать значение nullable loggingCallback
в хороший тип-безопасный Option
, а затем getOrElse
, чтобы предоставить альтернативную альтернативу.