Давайте идти построчно:
println(() => "2pac")
здесь вы передаете функцию Println. Помните, функция в Scala является только объектом, так Println это просто вызов toString
метод по типу Function0
, который только что всегда выводит <function>
(на самом деле для меня это выводит <function0>
)
println((() => "shakur")())
Теперь вы вызываете функцию Anon прежде чем он будет передан println
, поэтому вместо того, чтобы получать Function0
объект, он получает возвращаемое значение функции и просто выводит строковое
println(biggie)
Наконец, здесь biggie
не просто Function0
, это nullary Функция, означающая, что функция выполняется всякий раз, когда на нее ссылаются, и явно не требует вызова ()
. Это связано с тем, что вы определили его без списка параметров, а не пустым списком параметров. Так что, когда вы звоните println(biggie)
, функция biggie
вычисляется и его результат отправляется println
Если вы звоните println(biggie _)
, подчеркивание говорит составитель не оценить функцию, и вместо этого она проходит сама функция в println
. Точно так же, если вы определили biggie
как:
def biggie() = "smalls"
При вызове println(biggie)
он ведет себя так же, как и пропусканием 0-Arg функцию Анон.
Спасибо, что прояснил все! – TranquilMarmot
+1. Отлично. Но вы должны заменить «нулевую функцию» на «нулевой метод». Понятие «метод» и «функция» часто используется взаимозаменяемо, и различие часто не имеет большого значения, но здесь оно делает: нулевая функция не будет применяться автоматически даже тогда, когда отсутствует список параметров (пустой) в то время как нулевой метод будет (если используется в контексте, где ожидается некоторый тип, отличный от функции). Плюс методы делают различие между нулевым методом и методом no-arg, тогда как функция может быть только нулевой (функция no-arg не является чем-то, что существует в scala). –
'def' не функции, они методы. – pedrofurla