Scala-Sammlungen haben eine Reihe von lesbaren und fast lesbaren Operatoren wie :+
y +:
aber warum gibt es keine für Menschen lesbaren Synonyme wie append
?
Antworten
Zu viele Anzeigen?Alle änderbar Sammlungen in Scala haben die BufferLike-Eigenschaft und sie definiert eine anhängen. Methode.
Unveränderlich Sammlungen haben nicht die Eigenschaft BufferLike und definieren daher nur die anderen Methoden, die die vorhandene Sammlung nicht verändern, sondern eine neue erzeugen.
Symbolische Methodennamen erlauben die Kombination mit der Zuweisungsoperation =
.
Zum Beispiel, wenn Sie eine Methode haben ++
die eine neue Sammlung erstellt, können Sie automatisch die ++=
um die neue Sammlung einer Variablen zuzuweisen:
var array = Array(1,2,3)
array ++= Array(4,5,6)
// array is now Array(1,2,3,4,5,6)
Dies ist ohne symbolische Methodennamen nicht möglich.
Oft handelt es sich sogar um Synonyme, die für den Menschen lesbar sind:
foldLeft
ist gleichbedeutend mit/:
foldRight
ist gleichbedeutend mit:\
Bei den übrigen handelt es sich um Additionsoperatoren, die ohnehin recht gut lesbar sind:
++
ist äquivalent zu javaaddAll
:+
wird angehängt+:
ist vorangestellt
Die Position des Semikolons kennzeichnet die Empfängerinstanz.
Schließlich gibt es noch einige seltsame Operatoren, die von anderen funktionalen Programmiersprachen übernommen wurden. Zum Beispiel Listenkonstruktion (SML) oder Actor-Messaging (Erlang).
Ist sie anders als jede andere Sprache?
Nehmen wir Java. Was ist die für Menschen lesbare Version von +
, -
, *
y /
auf int
? Oder, nehmen wir an String
: Wie lautet die für Menschen lesbare Version von +
? Beachten Sie, dass concat
ist nicht das Gleiche - es akzeptiert keine nicht String
Parameter.
Vielleicht stört Sie das, weil in Java - anders als etwa in C++ - entweder ausschließlich nicht-alphabetische oder alphabetische Operatoren verwendet werden - mit Ausnahme von String
's +
.
Die Scala-Standardbibliothek ist nicht darauf ausgerichtet, Java-freundlich zu sein. Stattdessen werden Adapter bereitgestellt, um zwischen Java- und Scala-Sammlungen zu konvertieren.
Der Versuch, eine Java-freundliche API bereitzustellen, würde nicht nur die Wahl der Bezeichner einschränken (oder vorschreiben, dass Aliase bereitgestellt werden sollten), sondern auch die Art und Weise, wie Generika und Funktionstypen verwendet werden, begrenzen. Zur Validierung des Entwurfs wären wesentlich mehr Tests erforderlich.
In diesem Zusammenhang erinnere ich mich an eine Debatte darüber, ob die 2.8er Sammlungen die java.util.Iterable
.