2010-07-27 17 views
5

Kiedy używam konsoli scala, wypisuje obiekt w przejrzystym stylu, np.Jak sprawdzić obiekt w skrypcie jak w konsoli scala?

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

Ale jeśli piszę w pliku skryptu, jak:

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

drukuje tylko:

(mike,40,New York) 

Jak mogę to zrobić w pliku skryptu jak konsoli Scala? Czy istnieje metoda na to?

Odpowiedz

11

można pobrać typ zmiennej z oczywistego:

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] 

Jeśli wywnioskować typ T jest abstrakcyjny typ, musi być niejawna Manifest[T] warunkiem, inaczej nie będzie to skompilować.

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) 

Można zrobić wersję, która zapewnia domyślne niejawna Manifest[T] parametru w tym przypadku:

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

dzięki za odpowiedź. Chociaż teraz jest to dla mnie zbyt trudne do zrozumienia (po prostu uczę się tego przez 2 dni), ale myślę, że kiedyś je przeczytam uważnie :) – Freewind

+0

To drukuje typ, który jest miły, ale byłoby dobrze zobaczyć rzeczywiste wartości – cevaris

Powiązane problemy