Frage

Ich bin ganz neu in Scala Programmiersprache und versuche, etwas in meinem Kopf stucked, während ich das Skriptum folgenden wurde unter hier .

Ich glaube, ich konnte nicht wirklich verstehen, wie cons Operator funktioniert, hier sind einige Dinge, die ich versucht:

Ich habe einen Pseudo-Zufallszahlengenerator erstellt, dann versuchte, eine Liste mit einem zufälligen Wert zu erstellen:

scala> val gen = new java.util.Random
gen: java.util.Random = java.util.Random@1b27332

scala> gen nextInt 3 :: Nil
<console>:7: error: type mismatch;
 found   : List[Int]
 required: Int
       gen nextInt 3 :: Nil
                     ^

Aber es versucht, List (3) zu nextnt Methode zu übergeben. Wenn ich paratheses verwendet, es war kein Problem

scala> (gen nextInt 3) :: Nil
res69: List[Int] = List(1)

Ich war neugierig auf die Ausführungsreihenfolge, so dass ich eine Funktion erstellt, es zu überprüfen

scala> def pr(i:Int):Int = { println(i); i }
pr: (i: Int)Int

scala> pr(1) :: pr(2) :: pr(3) :: Nil
1
2
3
res71: List[Int] = List(1, 2, 3)

Wie in Ausgänge sehen ist, ist die Ausführungsreihenfolge die gleiche wie die Reihenfolge des Erscheinens. Dann dachte ich, es über den ‚nextInt‘ Funktion sein könnte, dann habe ich versucht, folgende:

scala> 1 + 2 :: Nil
res72: List[Int] = List(3)

Es zuerst ausgeführt hinaus und nach, dass die Nachteile ausgeführt. Also hier ist die Frage: Was ist der Unterschied zwischen gen nextInt 3 :: Nil und 1 + 2 :: Nil

War es hilfreich?

Lösung

Es gibt zwei Dinge von Interesse hier: Vorrang und fixity . Wie sepp2k erwähnt, diese Frage auf Stack-Überlauf den Vortritt erklärt, dachte die Regeln, wie zitiert, sind nicht vollständig genug, und es gab nur sehr kleine Veränderungen von Scala 2,7 bis Scala 2.8. Die Unterschiede betreffen vor allem Betreiber in = endet, though.

Wie bei fixity , fast alles, was in Scala gelesen links nach rechts, das ist, was Programmierer verwendet werden. In Scala jedoch enden Betreiber in : werden von rechts nach links gelesen werden.

Nehmen wir dann dieses Beispiel:

1 + 2 :: Nil

Als erster Vorrang. Was hat am meisten Vorrang, + oder :? Nach der Tabelle hat + Vorrang vor :, so wird die Zugabe zuerst getan. Daher ist der Ausdruck gleich folgt aus:

((1).+(2)) :: Nil

Jetzt gibt es keinen Vorrang Konflikt, aber da :: Enden in :, hat es eine diferent fixity. Es ist Lese rechts nach links, also:

Nil.::((1).+(2))

Auf der anderen Seite, in dieser:

gen nextInt 3 :: Nil

Der Betreiber :: hat Vorrang vor nextInt, weil : Vorrang vor allen Buchstaben hat. Aus diesem Grunde und seine Unveränderlichkeit Erinnerung, es wird:

gen nextInt Nil.::(3)

Was dann wird

gen.nextInt(Nil.::(3))

, an dem der Fehler hinweisen liegt auf der Hand.

PS: Ich schreibe (1).+(2) statt 1.+(2) weil zum Zeitpunkt des Schreibens dieses Artikels, 1. als Doppelnummer interpretiert wird, so dass 1.+(2) einen Infix Ausdruck Zugabe des Doppel 1,0 bis 2. Diese Syntax wie der Scala ist veraltet 2.10 0,0, und wird wahrscheinlich auf Scala 2.11 nicht vorhanden sein.

Andere Tipps

Es geht um den Vorrang nicht Ausführungsreihenfolge. + hat eine höhere Priorität als ::, so a + b :: c Parsen als (a + b) :: c. Allerdings Infix Methodenaufrufe mit regulären Namen haben niedrigere Priorität, so a foo b c Parsen als a foo (b c).

finden Sie unter für eine Liste von Operatoren href="https://stackoverflow.com/questions/2922347/operator-precedence-in-scala"> ihren Vorrang in scala bestellt.

scroll top