2015-03-13 19 views
5

Bazen, y ile aynı türde olmak üzere x bildirilmesi istenebilir. vals tür çıkarımı ile bu çok iyi işler, ancak bu, with function types gibi diğer bazı alanlarda çalışmaz. Bazı C++ deneyimlerine sahip bir programcı için belirgin görünen bir çözüm, bir decltype olacaktır. Mevcut Scala'da böyle bir tesis mevcut değil gibi görünüyor. bağlantılı sorularaScala neden bir declype içermiyor?

bir cevap verir: tipleri birinci sınıf vatandaş Ben bu anlamıyorum itiraf etmeliyim

değildir

çünkü. Tiplerin C++ 'da birinci sınıf bir vatandaş olduğunu düşünmüyorum ama yine de decltype. Ben jenerik ya da benzeri bir şey tür parametreleri için decltype gibi bir şey sormuyorum (Ben jenerikler şablonları değil ve türleri içinde silinir anlıyorum). Yine de, bir tür bir ifadenin türün beklendiği bir yerde kullanılmasına izin veren bir operatör olduğunu düşünüyorum - kesinlikle derleyici bir ifade türünü değerlendirebilmelidir, aksi halde val tanımlaması için çıkarım girmesi mümkün olmaz.

A decltype aşağıda gibi kullanılabilir - Kod, işe yarar bir şey bir şey yapmaya çalışmıyorum değil sadece sözdizimi ve temel kullanımını göstermek için:

case class A(x:Int = 0) 

val a = new A(10) 
val b = new decltype(a) 

def f(c:decltype(a)) : decltype(a.x+a.x) 

decltype yokluğu, kasıtlı bir karar mı yoksa orada Scala'nın buna sahip olmamasının bazı nedenleri? Belki buna izin verecek derleme zamanı yansımasını kullanan bir çözüm var mı? kimin tip bazı değişken x biz açıkça ifade etmek istemiyoruz varsa, örneğin

class Decl[T] { type Type = T } 
object Decl { def apply[T](x: T) = new Decl[T] } 

,:

val d = Decl(x) 
type TypeOfX = d.Type 
+0

Nasıl 'Burada devreye girer b' gelmez Benim ilk bıçak –

+0

@ m-z b sadece bir örnek olarak burada. Bu özel durumda, val b = a ile aynı olacaktır, ancak aynı durumun olmayacağı benzer bir durumu kolayca hayal edebilir. Soruyu güncellemeye çalışacağım. – Suma

+0

Soruyu anlamıyorum. Tip imzaları derleme zamanıdır, bu nedenle türünü statik olarak belirtebilmeniz gerekir. O zaman bu 'decltype' şeyi sana ne veriyor? Düzenli "val b: A = a" ve "f (c: A)" nın dezavantajı nedir: A'? –

cevap

1

?
+0

Bu gerçekten çok hoş. Biri 'Decl (x) .Type' yazamaz doğrudan (ya da en azından bir yol bulamadım), ama yine de güzel, bu iş yapar. – Suma

+0

Sanırım Scala'da 'decltype' gibi bir şeyin yokluğunun büyük olasılıkla kasıtlı bir karar olduğunu gösteriyor. – Suma