Beim Lernen von scala
bin ich auf folgenden seltsamen Ausschnitt gestoßen:
Ich würde erwarten, dass der Compiler einen Fehler auf val 2 = 123
werfen würde, weil die Bezeichner nicht mit einer Ziffer beginnen dürfen, sondern der Code ohne Warnung kompiliert wird.
Zur Laufzeit wird jedoch sofort eine Ausnahme ausgelöst:
Ausnahme im Thread "main" java.lang.ExceptionInInitializerError at temptests.TempTest.main (TempTest.scala) um sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Methode) bei sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) beim sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) bei java.lang.reflect.Method.invoke (Methode.java:498) um com.intellij.rt.execution.application.AppMain.main (AppMain.java:144) Verursacht von: scala.MatchError: 123 (der Klasse java.lang.Integer) at temptests.TempTest $. (TempTest.scala: 5) um temptests.TempTest $. (TempTest.scala) ... 6 mehr
Ich bin nur neugierig: Wie wird val 2 = 123
von Scala
verstanden? Warum gibt es keinen Fehler bei der Kompilierung?
Ich bin nur neugierig: Wie wird
val 2 = 123
von Scala verstanden?
Sie können sich val 2 = 123
als:
Der Teil für den Variablennamen in Scala ist nicht immer ein einfacher Name, er kann auch ein Muster sein, zum Beispiel:
%Vor%Zerlegt 1 und 2 zu x bzw. y. In scala ist alles, was nach einer case -Anweisung erlaubt ist, auch nach val erlaubt und wird in eine Musterübereinstimmung übersetzt.
From die Spezifikation (Hervorhebung von mir):
Wertdefinitionen können alternativ ein Muster als linke Seite haben. Wenn p ein Muster ist , das ein einfacher Name oder ein Name ist, gefolgt von a Doppelpunkt und ein Typ, dann wird die Wertdefinition
val p = e
als erweitert folgt:
(Überspringt das relevante Beispiel):
%Vor%Wenn p eine eindeutige gebundene Variable x hat:
Dies ist der Grund, warum der Compiler keinen Kompilierzeitfehler ausgibt. Das Thema wird in dieser Google-Gruppenfrage ausführlich besprochen.
Die linke Seite einer val
-Deklaration kann ein Muster sein. Siehe scala language documentation .
so
%Vor%kann als
geschrieben werden %Vor%was einen Übereinstimmungsfehler ergibt.
Im wirklichen Leben wird dies meistens verwendet, um Tupel zu lesbar lokalen Werten zu extrahieren:
%Vor%Tags und Links scala runtime-error