Son zamanlarda Scala'da bir ikili ağ protokolü uygulamak için biraz çalışıyorum. Paketlerdeki alanların birçoğu doğal olarak Scala Shorts'a eşleniyor. Bir Short
değişkenini (bir değer değil) kısaca arttırmak istiyorum. İdeal olarak, s += 1
(Ints için çalışır) gibi bir şey isterim.Scala'da Short türünde bir değişkeni artırmanın en kısa yolu nedir?
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
+=
operatör Short
tanımlanan, yani eklenmesinden önce, bir Int
örtülü bir dönüştürme s
olduğu görülmektedir değildir. Ayrıca Short
+ operatörünün bir Int
döndürür. İşte Ints için işler: Ben s = (s + 1).toShort
Herhangi fikirlerle gidersiniz
scala> var i = 0
i: Int = 0
scala> i += 1
scala> i
res2: Int = 1
Şimdilik? derleyici türleri maç yapmak için kullanacak
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
:
Biraz gecikmiş, [ilgili bir yazı] buldum (http://stackoverflow.com/questions/10975245). Ende Neu'nun cevabı Paul'un uzantısı ile daha iyi bir çözüm sunuyor. Bağlantılı posta, Paul'un uzantısının neden işe yaradığını bir şekilde aydınlatıyor. – kilo
Ayrıca dikkat çekicidir ki, JVM 'shorts' üzerinde aritmetik işlemleri doğrudan desteklememektedir. Bayt kodu talimatları her zaman "int" üzerinde çalışır. [Java Sanal Makine Spesifikasyonu] 'na bakın (https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.11.3). – kilo