без аргументов - PullRequest
       17

без аргументов

9 голосов
/ 02 мая 2011

Если я создаю функцию:

def a(): String = return "some string"

результат будет "a: () String" Так что я могу использовать его с / без скобок

С другой стороны, если я создам ту же функцию

def a:String = return "some other string"

Это было бы просто "a: String" и в этом случае я не могу использовать его в скобках.

В чем разница между этими двумя?

Ответы [ 2 ]

10 голосов
/ 02 мая 2011

Хорошая практика рекомендует определять функции, у которых нет побочного эффекта без (), и добавлять () как на сайте определения, так и на сайте вызова, когда функция имеет побочные эффекты (например, println() вместо println) .

6 голосов
/ 02 мая 2011

Если вы определите a следующим образом, без скобок (обратите внимание, ключевое слово return необязательно):

def a: String = "some other string"

, а затем вызовите его с круглыми скобками: a(), тогда () не пустой список аргументов для метода a;вместо этого Scala попытается применить () к строке, которую возвращает метод a.Сообщение об ошибке, которое вы получаете при попытке, намекает на это:

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

Итак, во втором случае a() означает нечто иное, чем в первом случае.В первом случае это просто означает «вызов a с пустым списком аргументов», а во втором случае это означает «вызов a, затем примените () к результату метода», что приведет к ошибкеa String.

edit Чтобы пояснить ваш второй вопрос в комментариях ниже, это зависит от того, что именно вы подразумеваете под "одним и тем же".Как вы видели в REPL, один выглядит так, как будто он имеет тип ()java.lang.String, а другой - java.lang.String.Посмотрите на следующее, в котором x и y превращаются в одно и то же:

scala> def a() = "aaa"
a: ()java.lang.String

scala> def b = "bbb"
b: java.lang.String

scala> val x = a _
x: () => java.lang.String = <function0>

scala> val y = b _
y: () => java.lang.String = <function0>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...