Разница между функцией с круглыми скобками и без

Возможный дубликат:
Функции против методов в Scala
В чем разница между def foo = {} и def foo() = {} в Scala?

В scala мы можем определить

def foo():Unit = println ("hello")

или

def foo:Unit = println ("hello")

Я знаю, что они не одно и то же, но в чем разница, и что нужно использовать, когда?

Если на это был дан ответ, прежде чем указывать мне эту ссылку.

Ответ 1

A Scala метод 0-арности может быть определен с круглыми скобками или без них (). Это используется, чтобы сигнализировать пользователю о том, что метод имеет какой-то побочный эффект (например, распечатывать или удалять данные), в отличие от того, который отсутствует, который впоследствии может быть реализован как val.

См. Программирование в Scala:

Такие безпараметрические методы довольно распространены в Scala. Напротив, методы, определяемые пустым скобками, например def height(): Int, называются пустыми методами. Рекомендуемое соглашение заключается в использовании безпараметрического метода, когда нет параметров, и метод обращается к изменяемому состоянию только путем чтения полей содержащего объекта (в частности, он не изменяет изменяемое состояние).

Это соглашение поддерживает принцип единого доступа [...]

Подводя итог, рекомендуется, чтобы стиль в Scala определял методы, которые не принимают никаких параметров и не имеют побочных эффектов в качестве безпараметрических методов, т.е. оставляют пустые круглые скобки. С другой стороны, вы никогда не должны определять метод, который имеет побочные эффекты без круглых скобок, потому что тогда вызовы этого метода будут выглядеть как выбор поля.