2012-06-11 14 views
5

aşağıdaki scala kodu Verilen: Ben altta yatan yazarak sorgulama yokScala neden Kısa ve Bayt türleri için bir "+ =" işleci tanımlar?

var short: Short = 0 
short += 1  // error: type mismatch 
short += short // error: type mismatch 
short += 1.toByte // error: type mismatch 

- o "Kısa + değer == Int" açık.

Sorularım şunlardır:
1. Operatörün kullanılabileceği herhangi bir yol var mı?
2. Değilse, neden kullanıcı Kısa & Byte?

[Ve uzantısı * =, | = & = vb]

sorun Kısa sınıfına "+ (Kısa)" tanımlandığını gibi görünüyor
+0

Aslında Short, "+ =" veya "* =" yöntemine sahip değil, kısa http://www.scala-lang.org/api/current/index.html#scala belgesine bakabilirsiniz. Kısa . x someoperator = y, derleyici tarafından otomatik olarak x = x someoperator y'ye çevriliyor. – Eastsun

+0

@Eastsun Ancak, Int :-) 'a op = b', genişletilmiş form için sözdizimsel şekerdir:' a = a op b', bu, tür hatasını açıklar (Kısa + Kısa -> Int). Kararın neden yapıldığını veya bu yapıyı niçin kullanabileceğini veya yapamadığını açıklamıyor. (C# 'da, byte + = 1' yerine ama byte = byte + 1 'yapamazsınız ve davranış standartta spesifiktir - C#' deki LHS türüne geri döndürülmüş bir döküm var). –

+0

@pst Evet, aynı şeyi C# 'daki gibi de yapabilirsin (Doğru hatırlamıyorsam) – Eastsun

cevap

1

olarak: Yani

def +(x: Short): Int 

her zaman bir Int döndürür.

Verilen sen + operasyonu (besbelli) şekeri alınmış sürümünde "kısa" var'a atanamıyor bir Int olarak değerlendirildiğinden + = "operatörünü" kullanmak mümkün olmadığı kadar sona bu:

x K= y 

ve x var ve K herhangi sembolik operatörüdür ve eğer x K yöntemi vardır: scala derleyici gibi ifadeler bulduğunda çünkü ikinci soruya gelince

short = short + short 

, bu "müsait" olduğunu sonra derleyici çevirir veya "desugar" için:

Ve sonra bununla derlemeye devam etmeye çalışır.

İlgili konular