2015-08-06 12 views
8

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 

:

+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

+3

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

cevap

7

Sen IntShort bir dönüşecektir örtük bir yöntem tanımlayabiliriz. Ayrıca, bu içeriğin bir açığı olsa da, bir yöntem bile nedenini bilmeden bir dönüşüm yaşayabileceğinizi, sadece yöntemin kapsam dahilinde içe aktarıldığından kod okunabilirliğinin de zarar gördüğünü unutmayın.

+2

Bu ayrıca 's = = 1' de çalışır. – Paul

İlgili konular