2010-07-27 10 views
5

Scala konsolunu kullandığımda, bir nesneyi net bir tarzda yazdırır, örn.Scala konsolunda olduğu gibi komut dosyasındaki bir nesneyi nasıl denetleyebilirim?

scala> val mike = ("mike", 40, "New York") 
mike: (java.lang.String, Int, java.lang.String) = (mike,40,New York) 

Ama gibi bir komut dosyasında yazarsanız:

val mike = ("mike", 40, "New York") 
println(mike) 

It sadece baskılar:

Ben scala konsolu gibi komut dosyası nasıl yapabilirim
(mike,40,New York) 

? Bunun için bir yöntem var mı?

cevap

11

Bir Manifest ile bir değişkenin türünü alabilirsiniz:

scala> def dump[T: Manifest](t: T) = "%s: %s".format(t, manifest[T]) 
dump: [T](t: T)(implicit evidence$1: Manifest[T])String 

scala> dump((1, false, "mike")) 
res3: String = (1,false,mike): scala.Tuple3[Int, Boolean, java.lang.String] 

türetilmiş tip T soyut bir tip ise, aksi takdirde bu derlemek olmaz sağladığı zımni Manifest[T] olmalıdır. Cevabınız için

scala> def dump2[T](t: T)(implicit mt: Manifest[T] = null) = "%s: %s".format(t, 
    | if (mt == null) "<?>" else mt.toString) 
dump2: [T](t: T)(implicit mt: Manifest[T])String 

scala> trait M[A] { 
    | def handle(a: A) = dump2(a) 
    | } 
defined trait M 

scala> (new M[String] {}).handle("x") 
res4: String = x: <?> 
+0

teşekkürler:

scala> trait M[A] { | def handle(a: A) = dump(a) | } <console>:7: error: could not find implicit value for evidence parameter of type Manifest[A] def handle(a: A) = dump(a) 

Bu durumda örtülü Manifest[T] parametre için varsayılan sağlayan bir sürümünü yapabiliriz. Şimdi benim için çok zor olsa da (sadece 2 gün boyunca öğreniyorum), ama sanırım birgün dikkatlice okuyacağım :) – Freewind

+0

Bu, güzel olanı basar ama gerçek değerleri görmek harika olurdu – cevaris

İlgili konular