2013-03-04 6 views
1

Допустим, мы делаемАнонимные функции в Println в Scala

object Test { 
    def main(args: Array[String]){ 
     println(() => "2pac")  // passing anon function 
     println((() => "shakur")()) // passing anon function, with empty args 
     println(biggie)   // passing named function, no args 
    } 

    def biggie = "smalls" 
} 

Это будет распечатать

<function> 
shakur 
smalls 

Почему анонимная функция, с той же сигнатурой типа в качестве имени функции, требует явного пустой арг? Почему biggie вызывается, когда печатается, но функция 2pac нет?

ответ

11

Давайте идти построчно:

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 функцию Анон.

+0

Спасибо, что прояснил все! – TranquilMarmot

+0

+1. Отлично. Но вы должны заменить «нулевую функцию» на «нулевой метод». Понятие «метод» и «функция» часто используется взаимозаменяемо, и различие часто не имеет большого значения, но здесь оно делает: нулевая функция не будет применяться автоматически даже тогда, когда отсутствует список параметров (пустой) в то время как нулевой метод будет (если используется в контексте, где ожидается некоторый тип, отличный от функции). Плюс методы делают различие между нулевым методом и методом no-arg, тогда как функция может быть только нулевой (функция no-arg не является чем-то, что существует в scala). –

+0

'def' не функции, они методы. – pedrofurla

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