В чем разница между забавой и весельем () в Scala? - PullRequest
5 голосов
/ 22 ноября 2011

Вот два объявления метода:

def fun = "x"

def fun() = "x"

Поскольку им обоим не нужны параметры и они возвращают строку, в чем разница, кроме вызова пути?

Ответы [ 4 ]

10 голосов
/ 22 ноября 2011

Помимо того, что в функциях без параметров нет побочного эффекта для функций без параметров, в Scala есть IS разница между fun и fun ().

funназывается функцией без параметров , тогда как fun () является функцией с «пустым списком параметров».

Короче говоря:

scala> def fun() = "x"
fun: ()java.lang.String

scala> fun
res0: java.lang.String = x

scala> fun()
res1: java.lang.String = x

scala> def fun = "y"
fun: java.lang.String

scala> fun
res2: java.lang.String = y

scala> fun()
<console>:9: error: not enough arguments for method apply: (index: Int)Char in class StringOps.
Unspecified value parameter index.
              fun()
             ^
4 голосов
/ 22 ноября 2011

Это просто соглашение:

obj.fun   //accessing like property with no side-effects

obj.fun() //ordinary method call, return value, but might also have side-effects 

Предпочитайте () версию, чтобы подчеркнуть, что это метод , а не простое свойство.

Обратите внимание, что это просто соглашение, способ документировать код, компилятор не применяет приведенные выше правила.

3 голосов
/ 22 ноября 2011

Функции без () обычно используются для выражения функциональности без побочных эффектов, как заметил @Tomasz (например, длина строки - если у вас одинаковая строка, длина будет одинаковой)

Если вы определяете функцию без скобок, вы не можете использовать их при вызове функции:

scala> def fun = "x"
fun: java.lang.String

scala> fun
res0: java.lang.String = x

scala> fun()
<console>:9: error: not enough arguments for method apply: (n: Int)Char in trait StringLike.
Unspecified value parameter n.
       fun()
          ^

scala> def fun() = "x"
fun: ()java.lang.String
//now you may use () or may not - it is up to you
scala> fun
res2: java.lang.String = x

scala> fun()
res3: java.lang.String = x
0 голосов
/ 22 ноября 2011

(Дополнения) Вы можете найти соглашение "чистый против побочного эффекта" здесь: Руководство по стилю Scala Глава 3.4.2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...