Я бы рекомендовал всегда начинать определение с такой функции, как:
def bar {}
и только в тех случаях, когда вы вынуждены изменить его на:
def bar() {}
Причина: давайтерассмотрим эти 2 функции с точки зрения возможного использования.Как их можно вызвать И где их можно передать.
Я бы не стал называть это функцией вообще:
def bar {}
Она может быть вызвана как:
bar
но не как функция:
bar()
Мы можем использовать эту полосу, когда определяем функцию более высокого порядка с параметром call-by-name:
def bat(f: => Unit) {
f //you must not use (), it will fail f()
}
Мы должныпомните, что => Unit
- это даже не функция.Вы абсолютно не можете работать с thunk, как если бы это была функция, поскольку вы не можете рассматривать его как значение функции, которое будет храниться или передаваться.Вы можете запускать только оценки фактического выражения аргумента (любое их количество). Scala: передача функции в виде блока кода между фигурными скобками
Функция, определенная с помощью ()
, имеет большую область применения.Он может использоваться точно в том же контексте, что и bar
:
def foo() = {}
//invokation:
foo
//or as a function:
foo()
. Он может быть передан в функцию с параметром call-by-name:
bat(foo)
Кроме того, если мы определим функцию более высокого порядка, которая принимает не параметр, определяющий имя по имени, а реальную функцию:
def baz(f: () => Unit) {}
Мы также можем передать foo
в baz
:
baz(foo)
Как мы видим, стандартные функции, такие как foo
, имеют большую область применения.Но используя функции, определенные без ()
плюс определяющие функции высшего порядка, которые принимают параметр call-by-name, давайте использовать более понятный синтаксис.
Если вы не пытаетесь заархивировать лучший, более читаемый код или если вам нужна возможность передать фрагмент кода как функции, определенной с помощью параметра call-by-name, так и функции, определенной с помощьюдействительной функции, затем определите вашу функцию как стандартную:
def foo() {}
Если вы предпочитаете писать более понятный и читаемый код, а ваша функция не имеет побочных эффектов, определите функцию как:
def bar {}
PLUS попытайтесь определить функцию высшего порядка, чтобы принимать параметр call-by-name, но не функцию.Только когда вас принуждают, только в этом случае используйте предыдущую опцию.