9 Stimmen

def ohne Argumente

Wenn ich eine Funktion erstelle:

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

das Ergebnis wäre "a: ()String" Ich kann es also mit/ohne Klammern verwenden

Wenn ich hingegen die gleiche Funktion erstelle

def a:String = return "some other string"

Es wäre einfach "a: String" und in diesem Fall kann ich es nicht mit Klammern verwenden.

Was ist der Unterschied zwischen diesen beiden?

11voto

Jean-Philippe Pellet Punkte 57683

Die gute Praxis empfiehlt, Funktionen zu definieren, die keine Nebenwirkung haben, ohne () und zum Hinzufügen der () sowohl an der Definitionsstelle als auch an der Aufrufstelle, wenn die Funktion Nebenwirkungen hat (z. B., println() statt println ).

6voto

Jesper Punkte 193903

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>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X