Литеральный параметр функции Scala по умолчанию

В scala можно указать значение по умолчанию для параметра, который является функцией?

Например, в моем коде у меня есть что-то вроде этого.

def noop(): Unit = {}

def doSomethingGreat(succeed: Boolean)(f: => Unit)(default: => Unit = noop): Unit = {
  if (success) {
    f
  } else {
    default
  }
}

Однако, когда я пытаюсь вызвать doSomethingGreat и пропускаю параметр по умолчанию, я получаю сообщение об ошибке, говорящее о том, что я не передал достаточно параметра. Любая помощь?

До сих пор мой обходной путь заключается в том, чтобы явно передать неактивную функцию в качестве третьего параметра, но это противоречит цели иметь там значение по умолчанию в первую очередь...


person LoudFlamingo    schedule 18.08.2014    source источник


Ответы (2)


Вам просто нужно добавить круглые скобки к вызову метода, и scala выберет функцию по умолчанию:

scala>  def noop(): Unit = { println(567) }
noop: ()Unit

scala>   def doSomethingGreat(succeed: Boolean)(f: => Unit)(default: => Unit = noop): Unit = {
     |     if (succeed) {
     |       f
     |     } else {
     |       default
     |     }
     |   }
doSomethingGreat: (succeed: Boolean)(f: => Unit)(default: => Unit)Unit

scala>   doSomethingGreat(succeed = true)(println(123))()
123

scala>   doSomethingGreat(succeed = false)(println(123))()
567
person Ende Neu    schedule 18.08.2014
comment
или предоставить обе функции в одном списке аргументов: def doSomethingGreat(succeed: Boolean)(f: => Unit, default: => Unit = noop): Unit - person Gabriele Petronella; 19.08.2014
comment
Спасибо Энде. Это очень похоже на то, чем я закончил. Думаю, мне было интересно, могу ли я полностью опустить замыкающие круглые скобки, чтобы Scala сделала вывод, что я намеренно пропустил аргумент по умолчанию. Впрочем, ничего критичного. - person LoudFlamingo; 19.08.2014
comment
Да, я тоже так думал, не знал, пока не попробовал. - person Ende Neu; 19.08.2014

Попробуйте noop _ в своем коде, чтобы правильно ссылаться на такое определение функции.

person cchantep    schedule 18.08.2014
comment
нет, частичное применение Function0 ни к чему не приведет. - person Gabriele Petronella; 19.08.2014