В Scala функции - это первоклассные значения , поэтому значение из pop
само по себе
(x:Int, y:Int) => println(s"$x $y is the number")
. Такое значение функции может сильно отличаться от, скажем, значения 42
, но тем не менее является обычным значением. Например, противопоставьте следующее
val i: Int = 42 // assigning value 42 to name i
val f: Int => String = i => "foo" // assigning value `i => "foo"` to name f
. Это может стать более понятным, если мы десугар pop
определение до
val pop: Function2[Int, Int, Unit] = new Function2[Int, Int, Unit] {
def apply(x: Int, y: Int): Unit = println(s"$x $y is the number")
}
, где мы видим, что pop
назначен экземпляр Function2
класс, который содержит метод apply
. Более того, pop(12, 3)
обращается к
pop.apply(12,3)
, где мы видим, что pop(12, 3)
просто вызывает метод класса Function2
. Сравните оценку из pop
pop
res6: (Int, Int) => Unit = <function2>
с функцией применение экземпляра функции pop
указывает на
pop(12,3)
12 3 is the number
pop
- это определение val ue в том смысле, что мы не можем изменить функцию, на которую оно указывает, например,
pop = (i: Int) => i.toString // error: reassignment to val
Функция без параметров может быть определена следующим образом:
val g = () => "I am function with no parameters"
g // evaluates g
g() // applies function pointed to by g