Это законная функция и правильно использует параметр по умолчанию:
def func(a: Int = 5) = a * 2
Тип этой функции: Int => Int
.
Этот код не компилируется:
def withCondition(func: (Nothing) => Any): Unit =
if (someExtConditionIsTrue) func()
, потому что ваш func
, как ожидается, будет принят то типа Nothing
. Возможно, что вы имели в виде, чтобы иметь функцию, которая не принимает арга:
def withCondition(func: => Int): Unit =
if (someExtConditionIsTrue) func()
Или вы можете «толчок» параметры по умолчанию для функции обертки:
def withCondition(func: Int => Int, a: Int = 5): Unit =
if (someExtConditionIsTrue) func(a)
// call it:
withCondition(func)
Вы можете попробовать неявные параметры вместо них по умолчанию как это:
implicit val defaultArg = 5
, а затем либо:
def withCondition(func: Int => Int)(implicit a: Int): Unit = func(a)
или перейти непосредственно к func
:
def func(implicit a: Int) = a * 2
EDIT
Для вызова функции, которая имеет по умолчанию аргумент можно использовать:
scala> def withCondition(func: => Int): Unit = println(func)
withCondition: (func: => Int)Unit
scala> def func(a: Int = 5) = a * 2
func: (a: Int)Int
scala> withCondition(func())
10
// or
scala> withCondition(func(3))
6
Если вы используете эту форму: def withCondition(func: => Int)
затем это означает, что он принимает функцию, которая возвращает Int и не принимает аргументов. В этом случае вы должны предоставить это значение для функции перед тем, как передать ее функции-обертки, потому что функция-обертка не может передавать какие-либо аргументы в функцию, которая не принимает аргументы. В вашем случае вы достигаете этого либо с помощью аргумента arg по умолчанию, либо явно передавая arg func
, как в приведенных выше примерах.
Следовательно, высказывание: «вы не можете получить какой-то Int из ничего». –
Aleksey, как назвать fuction с его собственным значением по умолчанию, пока вы не знаете, что это за функция. Вот почему обертка объявлена так неуточненной. – Observer
Так что теперь я думаю, что в значительной степени описывал всевозможные варианты. Единственное, что я бы изменил, это выработать правильный тип 'func' arg. Если он игнорирует возвращаемое значение (Unit), тогда лучше объявить его таким образом;).Но это отдельная проблема/вопрос. –