Скала различает следующие вещи:
- Функции / методы с без списков параметров («параметр по имени», если функция)
- Функции с один пустой список параметров
- Функции с одним параметром типа Единица измерения
Ничто из этого не эквивалентно, хотя для удобства Scala позволяет вам исключать пустые списки параметров. (Между прочим, два пустых списка параметров также не совпадают.)
Итак, даже если Unit
записано ()
, это не совпадает с параметром аргумента parens ()
для функции или метода. Вместо этого думайте о ()
как о Tuple0
.
Итак, если вы говорите f: Unit => Int
, вы имеете в виду, что «f принимает один параметр, но это действительно скучный параметр, потому что это Unit
, который всегда должен быть одинаковым Tuple0
значением ()
» , То, что вы пишете, действительно коротко для f: (Unit) => Int
.
Если вы говорите f: () => Int
, то вы имеете в виду, что «f не принимает параметров и выдает Int
».
Если вы говорите f: => Int
, то вы имеете в виду, что «задержите выполнение любого оператора, получающего значение Int
, до тех пор, пока мы не используем его в этом коде (и не переоцениваем его каждый раз)». С функциональной точки зрения это в основном совпадает с f: () => Int
(и внутренне преобразуется в тот же класс Function0
), но имеет другое использование, предположительно, для обеспечения более компактной формы замыканий (вы всегда опускаете =>
в коде вызова).