Scala gibt keinen Fehler bei der Kompilierung, wenn einem Zahlenliteral ein Wert zugewiesen wird.

8

Beim Lernen von scala bin ich auf folgenden seltsamen Ausschnitt gestoßen:

%Vor%

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?

    
cubic lettuce 19.03.2016, 13:14
quelle

2 Antworten

12
  

Ich bin nur neugierig: Wie wird val 2 = 123 von Scala verstanden?

Sie können sich val 2 = 123 als:

vorstellen %Vor%

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):

  

Wenn p eine eindeutige gebundene Variable x hat:

%Vor%

Dies ist der Grund, warum der Compiler keinen Kompilierzeitfehler ausgibt. Das Thema wird in dieser Google-Gruppenfrage ausführlich besprochen.

    
Yuval Itzchakov 19.03.2016, 13:26
quelle
3

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%     
Sascha Kolberg 19.03.2016 13:31
quelle

Tags und Links