2014-02-03 3 views
2

Допустим, у меня есть uncompilable (да, я знаю, что это не может быть compilled Потому что из FUNC) (код)вызов функции Scala с параметром неизвестно умолчанию

def withCondition(func: (Nothing) => Int): Unit = 
    if (someExtConditionIsTrue) func() 

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

def func(a: Int = 5) = a * 2 

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

P.S .: Я нашел обходное решение, сделав a вариант или проверить, где он равен нулю, но вопрос остается.

ответ

4

Это законная функция и правильно использует параметр по умолчанию:

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, как в приведенных выше примерах.

+0

Следовательно, высказывание: «вы не можете получить какой-то Int из ничего». –

+0

Aleksey, как назвать fuction с его собственным значением по умолчанию, пока вы не знаете, что это за функция. Вот почему обертка объявлена ​​так неуточненной. – Observer

+0

Так что теперь я думаю, что в значительной степени описывал всевозможные варианты. Единственное, что я бы изменил, это выработать правильный тип 'func' arg. Если он игнорирует возвращаемое значение (Unit), тогда лучше объявить его таким образом;).Но это отдельная проблема/вопрос. –

Смежные вопросы