Ich bin ziemlich neu in Scala Programmiersprache, und versuchte etwas aus meinem Kopf stecken, während ich die Vorlesungsnotizen bei here folgte.Understanding Infix-Methode Call-and-Cons-Operator (: :) in Scala
Ich glaube, ich konnte nicht wirklich verstehen, wie cons Operator funktioniert, hier sind einige Dinge, die ich versucht:
ich eine Pseudo-Zufallszahlengenerator erstellt haben, dann versucht, eine Liste mit einem Zufallswert zu erstellen:
scala> val gen = new java.util.Random
gen: java.util.Random = [email protected]
scala> gen nextInt 3 :: Nil
<console>:7: error: type mismatch;
found : List[Int]
required: Int
gen nextInt 3 :: Nil
^
Aber es versuchte, List (3) zu nächsten Methode zu übergeben. Wenn ich paratheses verwendet, gibt es kein Problem war
scala> (gen nextInt 3) :: Nil
res69: List[Int] = List(1)
Ich war neugierig auf die Ausführungsreihenfolge, so habe ich eine Funktion, 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 zu sehen ist, ist die Ausführungsreihenfolge die gleiche wie die Reihenfolge des Auftretens. Dann dachte ich, es über die ‚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 wird. Also hier ist die Frage: Was ist der Unterschied zwischen gen nextInt 3 :: Nil
und 1 + 2 :: Nil
?
Vielen Dank für Ihre ausführliche Antwort, es gab mir viele Hinweise auf viele andere Dinge. Aber ich habe noch eine Frage: Wie interpretiert der Compiler den Ausdruck in der dritten Codeabschnitt, den ich in meiner ersten Frage gab; in Klammern ausgedrückt? weil die Verwendung der Funktion pr gezeigt hat, dass die Ausdrücke in der Reihenfolge von links nach rechts ausgeführt werden. – ciuncan
Richtig, die Funktionsaufrufe werden von links nach rechts ausgewertet. Das liegt daran, dass 'pr (X)' die Argumentausdrücke von '::' sind und diese zuerst in der Reihenfolge ihrer Erscheinung ausgewertet werden und dann der Wert an die Methode übergeben wird. 'pr (1) :: pr (2) :: pr (3) :: Nil 'druckt 1 2 3. Aber' Nil.::(pr(3)).::(pr(2)). :: (pr (1)) 'druckt 3 2 1. Aber beide geben' List (1, 2, 3) zurück ' –
@ciuncan weiß ich nicht. Es kann sein, dass die Operatornotation mit der richtigen Fixität eine Bewertungsreihenfolge ermöglicht, die mit der Punktnotation nicht möglich ist, oder es könnte sein, dass der Compiler '::' Aufrufe optimiert, aber einen Fehler bezüglich der Bewertungsreihenfolge hat. –