Подтвердить что ты не робот

Scala пустое закрытие по умолчанию?

Просто быстрый вопрос. Кажется, я не могу найти ответ.

У меня есть определение метода в Scala, которое выглядит так:

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

Я хотел бы знать, есть ли лучший способ указать пустое закрытие по умолчанию. Вопрос не в том, как реализовать ведение журнала, это просто пример.

4b9b3361

Ответ 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, чтобы предоставить альтернативную альтернативу.