2010-08-16 3 views

Antwort

16

sehen. Sie definieren eine Methode. Die erste Methode hat keine Parameterlisten, die zweite hat eine Parameterliste, die leer ist. Die erste davon sollte wie diese

val x = foo 

genannt werden, während das zweite, ähnliche

aufgerufen werden soll
val x = foo() 

Allerdings wird die Scala-Compiler können Sie ohne Klammern Methoden mit einer leeren Parameterliste aufrufen , so funktioniert jede Form des Aufrufs für die zweite Methode. Methoden ohne Parameterlisten können nicht mit den Klammern

aufgerufen werden. Der bevorzugte Scala-Stil ist das Definieren und Aufrufen von Nicht-Argument-Methoden, die Nebenwirkungen mit den Klammern haben. Ohne Nebenwirkungen sollten keine Argumentationsmethoden definiert und aufgerufen werden.

Wenn Sie tatsächlich die eine Variable zu definieren, die Syntax ist

val foo = 5 
+5

Eigentlich verwenden, Scala finden Sie eine beliebige Anzahl von (nachgestellt) elide lassen leere Parameterlisten! Versuchen Sie 'def x()()()()()()() = 5 '! –

4

Was bedeutet es, wenn ich def verwenden können ein Feld in Scala

Sie kein Feld def mit definieren zu definieren.

scheint in beiden Fällen, dass ich mit einem variablen foo am Ende, das ich ohne Klammern beziehen, immer bis 5. Auswertung

Nein, in beiden Fällen wird mit einem Verfahren am Endefoo, die Sie ohne Klammern aufrufen können.

, das zu sehen, können Sie javap verwenden:

// Main.scala 
object Main { 
    def foo1 = 5 
    def foo2() = 5 
} 


F:\MyProgramming\raw>scalac main.scala 

F:\MyProgramming\raw>javap Main 
Compiled from "main.scala" 
public final class Main extends java.lang.Object{ 
    public static final int foo2(); 
    public static final int foo1(); 
} 

aber Sie sind nicht eine Variable in beiden Fällen definieren http://tommy.chheng.com/index.php/2010/03/when-to-call-methods-with-or-without-parentheses-in-scala/

6

Bevor irgendetwas anderes gesagt wird, ist def kein Feld definieren, ist es, ein Verfahren definiert.

Im zweiten Fall können Sie wegen einer bestimmten Eigenschaft von Scala Klammern weglassen. Es gibt zwei Unterschiede, die hier von Interesse sind: eine mechanische und eine empfohlene Verwendung.

Beginnend mit dem Letzten wird empfohlen, die leere Parameterliste zu verwenden, wenn es Nebenwirkungen gibt. Ein klassisches Beispiel ist close(). Sie würden Klammern weglassen, wenn das Aufrufen des Elements keine Nebenwirkungen hat.

Jetzt, als ein praktischer Unterschied - über mögliche komische syntaktische Verwechslungen in Eckfällen (ich sage nicht, es gibt nur Vermutungen) - müssen strukturelle Typen der richtigen Konvention folgen.

Zum Beispiel hatte Source eine close Methode ohne Klammern, wäre eine strukturelle Art von def close(): Unit bedeutet nicht akzeptieren Source. Wenn ich eine Strukturmethode wie def close: Unit definiere, werden Java-Objekte closeable ebenfalls nicht akzeptiert.

3

Zusätzlich zu den bereits gegebenen Antworten ich zwei Punkte hervorheben möchte:

  • Die Möglichkeit, ohne eine Parameterliste zu definieren Methoden ist eine Möglichkeit, die Uniform Access Principle zu realisieren. Dies ermöglicht es, den Unterschied zwischen Feldern und Methoden zu verbergen, was spätere Änderungen der Implementierung erleichtert.

  • Sie können ein Verfahren, wie def foo() = 5 mit foo definiert nennen, aber Sie kann eine Methode nicht Aufruf definiert als def foo = 5foo()

Verwandte Themen