2010-07-27 15 views
5

Cuando uso la consola scala, imprime un objeto en un estilo claro, p.¿Cómo inspeccionar un objeto en una secuencia de comandos como en la consola scala?

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

Pero si escribo en un archivo de script, como:

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

sólo muestra:

(mike,40,New York) 

¿Cómo puedo hacer en el archivo de secuencia de comandos como la consola Scala? ¿Hay un método para esto?

Respuesta

11

puede recuperar el tipo de una variable con un Manifiesto:

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] 

Si el tipo inferido T es un tipo abstracto, tiene que haber una implícita Manifest[T] proporcionado, de lo contrario no se compilará.

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) 

Se podría hacer una versión que proporciona un valor predeterminado para el parámetro Manifest[T] implícita en este caso:

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

gracias por su respuesta. Aunque ahora es muy difícil de entender (lo aprendo durante 2 días), pero creo que algún día lo leeré cuidadosamente :) – Freewind

+0

Esto imprime el tipo que es bueno, pero sería genial ver los valores reales – cevaris

Cuestiones relacionadas