For-Schleife in scala ohne Reihenfolge?
So, während der Arbeit meinen Weg durch die "Scala" für die Ungeduldigen" ich Frage mich: Können Sie ein Scala for-Schleife, ohne eine Sequenz?
Gibt es zum Beispiel eine übung in dem Buch, das Sie fragt, zu bauen, die ein counter-Objekt, das nicht erhöht werden Vergangenheit Integer.MAX_VALUE. Um zu testen, meine Lösung, schrieb ich den folgenden code:
var c = new Counter
for( i <- 0 to Integer.MAX_VALUE ) c.increment()
Dies wirft einen Fehler: Sequenzen enthalten, nicht mehr als Int.MaxValue-Elemente.
Es scheint mir, dass bedeutet, dass Scala ersten Zuteilung und füllen ein Sequenz-Objekt mit den Werten 0 bis Integer.MaxValue, und dann mit einer foreach-Schleife auf das Sequenz-Objekt.
Merke ich, dass ich dies tun könnte, statt:
var c = new Counter
while(c.value < Integer.MAX_VALUE ) c.increment()
Aber gibt es eine Möglichkeit zu tun, eine traditionelle C-style for-Schleife mit der for-Anweisung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Tat
0 to N
eigentlich nicht Auffüllen, alles mit zahlen von0
zuN
. Stattdessen erstellt Sie eine Instanz vonscala.collection.immutable.Range
, der wendet seine Methoden auf die zahlen generiert on-the-fly.Den Fehler, den Sie lief in nur, weil Sie müssen in der Lage sein zu passen, die Anzahl der Elemente (ob Sie tatsächlich existieren oder nicht) in den positiven Teil einer
Int
zu halten, um den Vertrag für dielength
Methode.1 to Int.MaxValue
funktioniert, wie0 until Int.MaxValue
. Und letzteres ist das, was deine while-Schleife macht sowieso (to
schließt das Recht ein Endpunktuntil
unterlässt es).Sowieso, da die Scala
for
ist eine ganz andere (viel allgemeineren) Wesen als die Cfor
, die kurze Antwort ist Nein, Sie können nicht genau die gleiche Sache. Aber wahrscheinlich können Sie tun, was Sie wollen mitfor
(wenn auch vielleicht nicht so schnell, wie Sie wollen, da gibt es einige performance-penalty).Wow, einige nette technische Antworten für eine einfache Frage (die ist gut!) Aber falls jemand gerade auf der Suche nach eine einfache Antwort:
Als Rex wies darauf hin, "zu" schließt das Recht Endpunkt "bis" unterlässt es.
Ja und Nein, es hängt davon ab, was Ihr bittet. Wenn Sie Fragen, ob Sie die Iteration über eine Sequenz von ganzen zahlen, ohne zu bauen, dass die Sequenz zuerst, dann kannst du ja zum Beispiel mit streams:
Dann:
Schreiben Sie Ihre eigenen iterator durch die Definition hasNext und next ist eine weitere option.
Wenn Sie Fragen, ob Sie mit der " for " - syntax zu schreiben, die eine "native" loop, also eine Schleife, die funktioniert durch die Inkrementierung einige native integer anstatt der Iteration über die Werte, die von einer Instanz eines Objekts, dann ist die Antwort, soweit ich weiß, Nein. Wie Sie vielleicht wissen, 'für' Verstehens sind syntaktischer Zucker für eine Kombination der Aufrufe von flatMap, filter, map und/oder foreach (alle definiert in der FilterMonadic Merkmal), abhängig von der Schachtelung von Generatoren und deren Typen. Sie können versuchen, zu kompilieren, einige-Schleife und drucken seine compiler-zwischendarstellung mit
zu sehen, wie Sie erweitert werden.
fromTo
kann weiter vereinfacht werden, indem mit der Methodeiterate
auf dieStream
(oderIterator
) companion-Objekt. Etwas entlang der Linien von:def fromTo(from: Int, to: Int) = Stream.iterate(from, to - from)(_ + 1)
. Aber mitfrom until to
ist mehr idiomatische und erreicht das gleiche.Gibt es eine Reihe von diesen gibt, aber ich kann nicht belästigt werden, googeln Sie im moment. Das folgende ist ziemlich canonical: