2012-09-29 17 views
6

Scala'nın manifesto kavramını öğreniyorum ve bazı basit durumlarda nasıl kullanılacağını anladım. Ne bulmacalar OptNanifest ve NoManifest nedir? Daha önce hiç görmedim. Birisi ihtiyaç duyulan/faydalı oldukları bir örnek verebilir mi?Scala'nın OptManifest ve NoManifest ne içindir?

(I Scala 2.10 TypeTags ile Manifest s kavramını değiştirir görüyoruz ama 2.10 sonuçlanana kadar biz Manifest s kullanmak zorunda.)

cevap

6

varsayalım aşağıdaki vaka sınıf ve tip takma adına sahip:

scala> case class Foo[A](a: A) 
defined class Foo 

scala> type F = Foo[_] 
defined type alias F 

Biz artık (değil çok yararlı) tip F ait şeylerin bir listesini yapın:

scala> val foos: List[F] = List(Foo(1), Foo("a"), Foo('a)) 
foos: List[F] = List(Foo(1), Foo(a), Foo('a)) 

Ve bir diziye bu açabilirsiniz:

scala> foos.toArray 
res0: Array[F] = Array(Foo(1), Foo(a), Foo('a)) 

Yani açıkça derleyici o List üzerinde toArray yöntemine örtük bir argüman olarak ihtiyacı tezahür bulmak mümkün değildir.

scala> manifest[F] 
<console>:11: error: overloaded method value classType with alternatives: 
    (prefix: scala.reflect.Manifest[_],clazz: Class[_],args: scala.reflect.Manifest[_]*)scala.reflect.Manifest[F] <and> 
    (clazz: Class[F],arg1: scala.reflect.Manifest[_],args: scala.reflect.Manifest[_]*)scala.reflect.Manifest[F] <and> 
    (clazz: Class[_])scala.reflect.Manifest[F] 
cannot be applied to (java.lang.Class[Foo[_$1]], scala.reflect.Manifest[_$1]) 
       manifest[F] 

Yani derleyici bizim tipi takma içinde joker temsil etmek manifestoyu kullanma konusunda sorun yaşıyor açıktır: Biz F için düz eski Manifest için sorarsanız, bir hatayla olsun.

toArray nedeninin çalışması, yalnızca Manifest değil, ClassManifest olmasını beklemesidir. Ve aslında için hiçbir sorunla karşılaşmadık, tam olarak, tür argümanlarını göstermek için OptManifest kullandığı için Manifest türünün aksine, tip argümanları yalnızca Manifest türünde başka bir şeydir.

scala> classManifest[F] 
res2: ClassManifest[F] = Foo[<?>] 

<?>NoManifest dize temsilidir O. Burada None rolünü oynar, burada derleyici F türüyle ilgili sınıf bilgilerini temsil eder (bu, bir dizi oluşturmak için gereken tek şeydir), F türünün argümanları hakkında hiçbir şey söylemeden "hayır, yapabilirim" t model ".

İlgili konular