Wo finde ich eine Liste der Scala „magischen“ Funktionen finden, wie apply
, unapply
, update
, +=
, usw.?
Mit magischen Funktionen meine ich Funktionen, die zum Beispiel von einem syntaktischen Zucker des Compilers verwendet werden
o.update(x,y) <=> o(x) = y
Ich habe nach einer Kombination von scala
magic
und Synonymen von gegoogelt functions
, aber ich habe nichts gefunden.
Ich interessiere mich nicht für die Verwendung von magischen Funktionen in der Standardbibliothek, sondern für welche magischen Funktionen es gibt.
identifier_=
? Das habe ich noch nie gesehen.object X { var _x = 0; def x_=(n: Int) { _x = n }; def x = _x }; X.x = 5; println(X.x)
identifier
sollte nur ein Platzhalter sein. Ich habs. Vielen Dank.equals
das wird von==
Neben
update
undapply
gibt es auch eine Reihe von unären Operatoren, die (glaube ich) als magisch gelten:unary_+
unary_-
unary_!
unary_~
Fügen Sie dazu die regulären Infix / Suffix-Operatoren hinzu (die fast alles sein können) und Sie haben das komplette Paket.
Sie sollten sich unbedingt die Scala-Sprachspezifikation ansehen. Es ist die einzige maßgebliche Quelle für dieses Zeug. Es ist nicht so schwer zu lesen (solange Sie mit kontextfreien Grammatiken vertraut sind) und sehr leicht zu durchsuchen. Das einzige, was nicht gut angegeben wird, ist die XML-Unterstützung.
quelle
Es tut mir leid, wenn Ihre Frage nicht genau beantwortet wird, aber mein bisheriger Lieblings-WTF-Moment ist @ als Zuweisungsoperator innerhalb der Musterübereinstimmung. Dank der weichen Kopie von "Programming in Scala" fand ich ziemlich schnell heraus, was es war.
Mit @ können wir jeden Teil eines Musters an eine Variable binden. Wenn die Musterübereinstimmung erfolgreich ist, erfasst die Variable den Wert des Untermusters. Hier ist das Beispiel aus der Programmierung in Scala (Abschnitt 15.2 - Variablenbindung):
expr match { case UnOp("abs", e @ UnOp("abs", _)) => e case _ => }
Und hier ist , was Programming Scala dazu sagt.
Dieser Link funktioniert nicht mehr. Hier ist eine, die es tut.
quelle
Ich werde auch
_*
für den Mustervergleich eine beliebige Anzahl von Parametern wie hinzufügencase x: A(_*)
Und Operatorassoziativitätsregel aus dem Odersky-Spoon-Venners-Buch:
Vielleicht sollten wir auch das syntaktische Desugaring von für Ausdrücke erwähnen , die hier zu finden sind
Und (natürlich!) Alternative Syntax für Paare
a -> b //converted to (a, b), where a and b are instances
(Wie richtig ausgeführt, handelt es sich bei diesem nur um eine implizite Konvertierung , die über eine Bibliothek durchgeführt wird. Daher ist er wahrscheinlich nicht zulässig, aber ich finde, er ist ein häufiges Rätsel für Neulinge.)
quelle
->
ist nur eine Bibliotheksfunktion.Ich möchte hinzufügen, dass es auch ein "magisches" Merkmal gibt -
scala.Dynamic
:Sie können also Dinge wie tun
import scala.language.dynamics object Dyn extends Dynamic { def applyDynamic(name: String)(a1: Int, a2: String) { println("Invoked " + name + " on (" + a1 + "," + a2 + ")"); } } Dyn.foo(3, "x"); Dyn.bar(3, "y");
quelle
Sie sind in der Scala-Sprachspezifikation definiert. Soweit ich weiß, gibt es nur drei "magische" Funktionen, wie Sie erwähnt haben.
Scalas Getter und Setter können sich auch auf Ihre "Magie" beziehen:
scala> class Magic { | private var x :Int = _ | override def toString = "Magic(%d)".format(x) | def member = x | def member_=(m :Int){ x = m } | } defined class Magic scala> val m = new Magic m: Magic = Magic(0) scala> m.member res14: Int = 0 scala> m.member = 100 scala> m res15: Magic = Magic(100) scala> m.member += 99 scala> m res17: Magic = Magic(199)
quelle