Scala распечатка дополнительных скобок - PullRequest
1 голос
/ 05 октября 2009

Я написал свой первый пример программы Scala, и она выглядит так:

def main(args: Array[String]) {     
    def f1 = println("aprintln")
    println("applying f1")
    println((f1 _).apply)
    println("done applying f1")
}

Выход

applying f1
aprintln
()
done applying f1

Может кто-нибудь объяснить, почему появляется дополнительный ()? Я думал, что появится только aprintln.

спасибо,

Джеф

Ответы [ 2 ]

4 голосов
/ 05 октября 2009

Это решит проблему:

def main(args: Array[String]) {         
    def f1 = println("aprintln")
    println("applying f1")
    (f1 _).apply
    println("done applying f1")
}

И так будет:

def main(args: Array[String]) {         
    def f1 = "aprintln"
    println("applying f1")
    println((f1 _).apply)
    println("done applying f1")
}

Здесь происходит то, что вы выполняете функцию f1 с вызовом apply. Функция f1 печатает 'aprintln' и возвращает (). Затем вы передаете вывод f1, который равен (), другому вызову println. Вот почему вы видите дополнительную пару паранов на консоли.

Пустые скобки имеют тип Unit в Scala, что эквивалентно void в Java.

2 голосов
/ 05 октября 2009

Методы, которые будут иметь возвращаемый тип void в Java, имеют возвращаемый тип Unit в Scala. (), как вы пишете значение единицы.

В вашем коде f1 вызывает println напрямую. Поэтому, когда вы вызываете f1 и передаете его результат в println, вы оба печатаете строку в теле f1 и печатаете ее результат, который tostring'ed as ().

...