Если вы определите 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>