Inkrement ( ++ ) - operator in Scala
Gibt es einen Grund für Scala nicht die Unterstützung der ++ - operator inkrementiert werden primitive Typen standardmäßig?
Zum Beispiel, Sie können nicht schreiben:
var i=0
i++
Dank
- einfach nur neugierig, können Sie die Ausgabe i += 1 in der Scala?
- Ja, Sie können, aber nur wenn es ein
var
und nicht einval
. Wenn der Scala-compiler findet eine Methode Endung = aufgerufen var und die Klasse nicht haben, dass Methode (variable method= arg
), weitet es aufvariable = variable.method(arg)
. - Hier ist der original text von <Programmierung in scala 3.> 2016 :
Note that Java's ++i and i++ don't work in Scala. To increment in Scala, you need to say either i = i + 1 or i += 1
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meine Vermutung ist, dass diese weggelassen wurde, weil es würde nur Arbeit für die veränderlichen Variablen, und es würde keinen Sinn machen, für unveränderliche Werte. Vielleicht war es beschlossen, dass die
++
Betreiber nicht Schreien Zuordnung, so kann es zu Fehlern führen, die mit Bezug auf ob oder nicht Sie sind mutiert die variable.Ich das Gefühl, dass so etwas sicher zu machen (auf einer Linie):
aber das wäre eine schlechte Praxis (in jeder Sprache):
Sie wollen nicht zu mischen, Zuweisungsanweisungen und Nebenwirkungen/mutation.
*(a++) = ++*(b++)
Sachen gibt es....Ich mag Craig's Antwort, aber ich denke, der Punkt muss sein, stärker aus.
Gibt es keine "primitiven" -- wenn
Int
es tun können, dann kann so ein Benutzer-madeComplex
(zum Beispiel).Grundsätzliche Verwendung von
++
würde wie folgt Aussehen:var x = 1 //or Complex(1, 0)
x++
Wie setzen Sie
++
in der KlasseComplex
? Unter der Annahme, dass, wieInt
, das Objekt unveränderlich ist, dann ist die++
Methode zurückgeben muss, ein neue - Objekt, aber das neue Objekt zugeordnet.Wäre es erforderlich, eine neue Sprache-Funktion. Zum Beispiel, sagen wir, wir erstellen eine
assign
Schlüsselwort. Der Typ Signatur benötigen würde, um geändert werden, als auch, um zu zeigen, dass++
ist nicht Rückkehr eineComplex
, aber zuweisen es zu was auch immer Bereich hält das gegenwärtige Objekt. In Scala Geist nicht eindringen in die Programmierer-namespace, lassen Sie uns sagen, wir tun das, indem die Art, mit@
.Dann könnte es so sein:
Das nächste problem ist, dass postfix-Operatoren saugen mit Scala Regeln. Zum Beispiel:
Weil der Scala-Regeln, das ist das gleiche wie:
War ja nicht die Absicht. Nun, Scala Privilegien eine fließende Stil:
obj method param method param method param ...
. Dass mischt sich gut mit C++/Java traditionellen syntaxobject method parameter
mit funktionalen Programmierung Konzept des pipelining eine Eingabe, über mehrere Funktionen, um die end-Ergebnis. Dieser Stil wurde vor kurzem als "fluent interfaces" als gut.Das problem ist, dass durch die Privilegierung, dass der Stil, der Krüppel postfix-Operatoren (und Präfix, aber Scala kaum hat Sie sowieso). Also, am Ende, Scala hätte um große Veränderungen, und es wäre in der Lage zu Messen, um die Eleganz von C/Java Inkrement-und Dekrement-Operatoren sowieso-es sei denn, es ist wirklich wich von der Art der Sache, die es hat unterstützen.
In der Scala ++ ist eine gültige Methode und keine Methode impliziert die Zuordnung. Nur
=
tun kann.Längere Antwort ist, dass Programmiersprachen wie C++ und Java behandeln
++
speziell und Scala behandelt=
speziell, und in einem inkonsistenten Weise.In der Scala, wenn Sie schreiben
i += 1
der compiler sucht zunächst nach einer Methode namens+=
auf der Int. Es gibt ' s nicht so weiter, es funktioniert es ist Magie auf=
und versucht zu kompilieren der Linie, als wenn es Leseni = i + 1
. Wenn Sie schreibeni++
dann Scala wird die Methode aufrufen++
aufi
und weisen Sie das Ergebnis... nichts. Denn nur=
bedeutet Zuordnung. Sie schreiben konntei ++= 1
aber diese Art von Niederlagen der Zweck.Die Tatsache, dass Scala unterstützt die Methode Namen wie
+=
ist bereits umstritten, und einige Leute denken, es ist operator zu überladen. Sie könnte Hinzugefügt haben spezielle Verhalten für++
aber dann wäre es nicht mehr eine gültige Methode name (wie=
) und es wäre ein mehr Ding sich zu erinnern.Denke ich, die Argumentation in Teil, ist, dass
+=1
ist nur ein weiterer Charakter, und++
verwendet wird, ziemlich stark in den Sammlungen code für die Verkettung. Also es hält den code sauberer.Auch, Scala unveränderbare Variablen und
++
ist in Wirklichkeit eine mutierend Betrieb. Wenn Sie benötigen+=
zumindest können Sie erzwingen, dass alle Ihre Mutationen zu gehen, durch eine gemeinsame Vergabe Verfahren (z.B.def a_=
).Natürlich können Sie, dass in der Scala, wenn Sie wirklich wollen:
Und hier gehen Sie:
x
Wert soll 2 sein, nicht 3, wie postfix++
ist post-Inkrement. Die Herausforderung, um zu beeindrucken das Publikum ist: können Sie implementieren sowohl Präfix-und postfix-Formen verhält sich wie erwartet auf veränderlichen Numerik? 😉Der primäre Grund ist, dass es nicht die Notwendigkeit, in Scala, wie in C. in C sind Sie ständig:
C++ Hinzugefügt hat, die höhere Ebene, Methoden zur Vermeidung von für die explizite Schleifen, aber Scala hat viel weiter gegangen Bereitstellung von foreach, map, flatMap foldLeft etc. Auch wenn Sie eigentlich bedienen wollen, sich auf eine Sequenz von ganzen zahlen, anstatt einfach nur Radfahren obwohl eine Sammlung von nicht-integer-Objekten, die Sie verwenden können, Scala-Bereich.
Da der ++ - operator wird verwendet, durch die Sammlung der Bibliothek, ich fühle es besser, vermeiden Sie den Einsatz in nicht-collection-Klassen. Ich verwendet, um zu verwenden ++ als Wert zurückgeben Methode in meinem Util-Paket-Paket-Objekt etwa so:
Aber ich entfernt es. Die meisten der Zeit, wenn ich verwendet, ++ oder + 1 auf eine ganze Zahl, habe ich später einen besseren Weg gefunden, die doesn ' T erfordern es.
Es ist möglich, wenn Sie definieren Sie eine eigene Klasse, die simulieren können Sie die gewünschte Ausgabe-aber es kann ein Schmerz, wenn Sie möchten, verwenden Sie den normalen "Int" - Methoden so gut, da müsste man immer verwenden *()
Einige mögliche Testfälle
Können definieren var:
++i ist schon kurz genug:
Nun i++ kann wie folgt Aussehen:
Verwenden oben genannten syntax definieren, irgendwo in einem package-Objekt und dann importieren:
Operatoren Verkettung ist auch möglich:
Obigen Beispiel ist ähnlich wie diese mit Java (C++?) code:
Stil verlassen konnte, natürlich.
Nicht enthalten ist, weil Scala Entwickler Gedanken machen, die Spezifikation komplexer, während das erreichen nur äußerst geringe Vorteile und weil Scala keine Operatoren an allen.
Könnten Sie schreiben Ihre eigenen einer wie dieser:
Aber ich bin sicher, Sie werden in ein paar Probleme mit der Rangfolge nicht so funktioniert, wie Sie erwarten. Außerdem, wenn ich++ aufgestockt würde, würden die Leute Fragen, für ++auch ich, die nicht wirklich fit in Scala syntax.
++:
Methode zur Unterstützung der Präfix-Operatoren, wieval a = ++:5
. Aber ich denke, dass sieht ein wenig seltsam.i++
funktionieren soll--i++
soll äquivalent sein zu{ val temp = i; i += 1; temp }
.+=
ist sehr viel besser lesbar.var a = 5; a++; assert(a == 6)
weila
sich eigentlich nicht ändern.