В методе
def tweener(method: () => Unit) {
method()
}
метод называется tweener
, параметр произвольно называется method
, а тип method
равен () => Unit
, что является типом функции, как вы можете сказать из =>
.
Unit
- это тип возврата, аналогичный void
в Java, и не представляет интересного возвращаемого значения. Например, тип возврата print
равен Unit
. ()
представляет пустой список параметров.
сбивает с толку, ()
также используется для представления экземпляра Unit
, называемого единицей измерения , единственное значение, которое может принимать Unit
. Но это , а не , что означает в типе функции () => Unit
, точно так же, как вы не можете иметь тип функции 42 => Unit
.
Возвращаясь к вашему примеру, tweener
принимает функцию типа () => Unit
. operateOnList
- это метод , но он частично применяется компилятором для преобразования его в значение функции. Вы можете сами превратить методы в функции:
scala> def m = println("hi")
m: Unit
scala> m _
res17: () => Unit = <function0>
operateOnList
можно превратить в правильный тип функции, поскольку ее список параметров пуст ()
, а тип возвращаемого значения - implicity Unit
.
В качестве дополнительного примечания: если operateOnList
были определены без пустого списка параметров (что допустимо, но более распространено, когда тип возвращаемого значения не является Единицей), вам потребуется частично применить его вручную, иначе его значение будет передано вместо:
def f1() {}
def f2 {}
def g(f: () => Unit) {}
g(f1) // OK
g(f2) // error, since we're passing f2's result (),
// rather than partial function () => Unit
g(f2 _) // OK