Распечатка дополнительных круглых скобок Scala
Вопрос
Я написал свой первый пример программы на 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 появится.
Спасибо,
Джефф
Решение
Это решит проблему:
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.
Другие советы
Методы, которые имеют тип возврата void в Java, имеют тип возврата Unit в Scala.() — это то, как вы записываете значение единицы.
В вашем коде f1 напрямую вызывает println.Таким образом, когда вы вызываете f1 и передаете его результат в println, вы одновременно печатаете строку в теле f1 и печатаете ее результат, который преобразуется в строку как ().