2016-11-08 5 views
1

В общем, я хочу понять, как Scala вводит параметр для функции, которая принимает параметр типа Unit, когда () опущен для его вызова.Функция, которая принимает параметр типа устройства

В this question приведен пример:

val fun1: Unit => Int = u => 5 

И он может быть вызван следующим образом:

fun1() 

Как это компилировать? Является ли () как параметр вместо вызова функции, т. Е. Как внутренние скобки, как в fun1(())?

@ThaDon задал тот же вопрос, без ответа.

Более того, я обнаружил, что это не будет работать:

scala> def unit =() 
scala> fun1 unit 
<console>:12: error: value unit is not a member of Unit => Int 
    fun1 unit 
     ^

Но это:

scala> fun1() 
warning: there was one deprecation warning; re-run with -deprecation for details 
res5: Int = 5 

и этот

scala> fun1(unit) 
res3: Int = 5 

обе работы.

Что мне недостает fun1 unit? Как компилятор разбирает этот код?

ответ

0

Функции с аргументами нужна скобка для применения в Scala

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

для примера

println("foobar") 

fun1(unit) но не fun1 unit

+0

Спасибо! Я не знал об устаревании вставки '()' для параметров в 2.11.x, но я думаю, что это хорошее изменение! –

1

Как это компилировать? Is() выводится как параметр вместо вызова функции, т. Е. Как внутренние скобки, как в fun1 (())?

Да. Обратите внимание на there was one deprecation warning; re-run with -deprecation for details. Если вы повторите попытку, вы увидите, что компилятор сообщает вам, что именно происходит:

[warn] /tmp/rendererUa1FraPj2B/src/main/scala/test.scala:7: Adaptation of argument list by inserting() has been deprecated: this is unlikely to be what you want. 
[warn]   signature: Function1.apply(v1: T1): R 
[warn] given arguments: <none> 
[warn] after adaptation: Function1((): Unit) 
[warn] fun1() 
[warn]  ^
+0

Спасибо! Я просто понял, что вставка '()' для параметров устарела в 2.11.x. –

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