Wenn Sie definieren a
so, ohne Klammern (beachten Sie, dass die return
Schlüsselwort ist nicht erforderlich):
def a: String = "some other string"
und rufen es dann mit Klammern auf: a()
dann ist die ()
nicht die leere Argumentliste für die Methode ist a
; stattdessen wird Scala versuchen, die ()
zu der Zeichenkette, die Methode a
zurück. Die Fehlermeldung, die Sie erhalten, wenn Sie dies versuchen, weist darauf hin:
scala> a()
<console>:7: error: not enough arguments for method apply: (n: Int)Char in trait StringLike.
Unspecified value parameter n.
a()
^
Also im zweiten Fall, a()
bedeutet etwas anderes als im ersten Fall. Im ersten Fall bedeutet es einfach "anrufen a
mit einer leeren Argumentliste", und im zweiten Fall bedeutet es "Aufruf a
, dann gelten ()
zum Ergebnis der Methode", was bei einem String
.
エディット Um auf Ihre zweite Frage in den Kommentaren weiter unten einzugehen, hängt es davon ab, was genau Sie mit "das Gleiche" meinen. Wie Sie in der REPL gesehen haben, sieht eines so aus, als hätte es den Typ ()java.lang.String
und die andere hat den Typ java.lang.String
. Sehen Sie sich den folgenden Abschnitt an, in dem x
et y
in dasselbe verwandeln:
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>