2015-08-06 5 views
8

Ich habe in letzter Zeit ein bisschen an der Implementierung eines binären Netzwerkprotokolls in Scala gearbeitet. Viele der Felder in den Paketen sind natürlich Scala Shorts zugeordnet. Ich möchte eine Short Variable (kein Wert) prägnant erhöhen. Im Idealfall möchte ich etwas wie s += 1 (die für Ints funktioniert).Was ist der kürzeste Weg, um eine Variable vom Typ Short in Scala zu inkrementieren?

scala> var s = 0:Short 
s: Short = 0 

scala> s += 1 
<console>:9: error: type mismatch; 
found : Int 
required: Short 
       s += 1 
       ^

scala> s = s + 1 
<console>:8: error: type mismatch; 
found : Int 
required: Short 
     s = s + 1 
      ^

scala> s = (s + 1).toShort 
s: Short = 1 

scala> s = (s + 1.toShort) 
<console>:8: error: type mismatch; 
found : Int 
required: Short 
     s = (s + 1.toShort) 
      ^

scala> s = (s + 1.toShort).toShort 
s: Short = 2 

+= Der Bediener wird nicht auf Short definiert ist, so scheint es eine implizite Umwandlung s an ein Int die Zugabe vorhergehenden zu sein. Außerdem gibt Short 's + -Operator eine Int zurück. Hier ist, wie es für Ints funktioniert:

scala> var i = 0 
i: Int = 0 

scala> i += 1 

scala> i 
res2: Int = 1 

Denn jetzt ich mit s = (s + 1).toShort

Irgendwelche Ideen gehen werde?

+1

Etwas verspätet, habe ich einen [verwandten Beitrag] (http://stackoverflow.com/questions/10975245) gefunden. Ende Neu's Antwort, mit Pauls Erweiterung, bietet eine bessere Lösung. Der verlinkte Beitrag beleuchtet etwas, warum Pauls Erweiterung funktioniert. – kilo

+3

Interessant ist auch, dass die JVM nicht direkt arithmetische Operationen auf "Shorts" unterstützt. Die Bytecode-Befehle arbeiten immer auf 'int's. Weitere Informationen finden Sie in der [Java Virtual Machine-Spezifikation] (https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.11.3). – kilo

Antwort

7

Sie könnten eine implizite Methode definieren, die Int auf ein Short konvertieren:

scala> var s: Short = 0 
s: Short = 0 

scala> implicit def toShort(x: Int): Short = x.toShort 
toShort: (x: Int)Short 

scala> s = s + 1 
s: Short = 1 

Der Compiler wird es verwenden, um die Typen übereinstimmen. Beachten Sie jedoch, dass das implizit auch einen Mangel hat, irgendwo könnte eine Konvertierung stattfinden, ohne auch nur zu wissen, warum, nur weil die Methode in den Bereich importiert wurde, leidet auch die Code-Lesbarkeit.

+2

Damit funktioniert auch 's + = 1'. – Paul

Verwandte Themen