2012-07-01 16 views
6

Supongamos, tenemos algo como:¿Cómo puedo determinar el tipo de variable cuando no se proporciona?

val x = "foo".charAt(0) 

y asumamos más, no sabemos el tipo de retorno del método charAt(0) (que es, por supuesto, que se describe en la API de Scala). ¿Hay alguna manera de averiguar qué tipo tiene la variable x después de su definición y cuándo no se ha declarado explícitamente?

ACTUALIZACIÓN 1: Mi pregunta inicial no era lo suficientemente precisa: Me gustaría saber (por razones de depuración) qué tipo tiene la variable. Tal vez haya alguna opción de compilación para ver de qué tipo la variable se declara mediante la inferencia de tipo de Scala.

+1

Sería difícil responder a esta pregunta sin información adicional. ¿A qué te refieres con "determinar el tipo"? ¿Hacer algo con eso en tiempo de compilación? ¿En tiempo de ejecución? ¿Necesita el _type_, o es el 'java.lang.Class' lo suficientemente bueno? ¿Puedes usar Scala 2.10? –

+0

Este tipo de "tipo de letra" generalmente indica que su código es generalmente fastidioso; debe estructurar su código para que el polimorfismo lo solucione de forma natural. –

+0

@TravisBrown Tiene razón, mi pregunta no es lo suficientemente precisa. Me gustaría saber (por razones de depuración) qué tipo tiene la variable. Tal vez haya alguna opción de compilación para ver de qué tipo la variable se declara mediante la inferencia de tipo de Scala. –

Respuesta

7

Suponga que tiene la siguiente en un archivo de origen denominado Something.scala:

object Something { 
    val x = "foo".charAt(0) 
} 

Usted puede utilizar el indicador -Xprint:typer compilador para ver el programa después de que el compilador de typer fase:

$ scalac -Xprint:typer Something.scala 
[[syntax trees at end of typer]]// Scala source: Something.scala 
package <empty> { 
    final object Something extends java.lang.Object with ScalaObject { 
    def this(): object Something = { 
     Something.super.this(); 
    () 
    }; 
    private[this] val x: Char = "foo".charAt(0); 
    <stable> <accessor> def x: Char = Something.this.x 
    } 
} 

También es posible usar :type en el REPL:

scala> :type "foo".charAt(0) 
Char 

scala> :type "foo".charAt _ 
Int => Char 

El IDE también puede proporcionar una manera más agradable de obtener esta información, como señala Luigi Plinge en un comentario anterior.

+0

Perfecto, muchas gracias, ¡esto me ayudó mucho (ambas variantes)! –

3

El uso de este método para el problema:

x.getClass 
3

Aquí es una versión más fácil de Travis primera alternativa:

[email protected]:~/tmp$ scala -Xprint:typer -e '"foo".charAt(0)' 
[[syntax trees at end of      typer]] // scalacmd8174377981814677527.scala 
package <empty> { 
    object Main extends scala.AnyRef { 
    def <init>(): Main.type = { 
     Main.super.<init>(); 
    () 
    }; 
    def main(argv: Array[String]): Unit = { 
     val args: Array[String] = argv; 
     { 
     final class $anon extends scala.AnyRef { 
      def <init>(): anonymous class $anon = { 
      $anon.super.<init>(); 
      () 
      }; 
      "foo".charAt(0) 
     }; 
     { 
      new $anon(); 
     () 
     } 
     } 
    } 
    } 
} 
+0

Gracias Daniel por proporcionar información adicional. Utiliza una opción de Scala, ¿dónde puedo leer todas las opciones de Scala? Solo pude encontrar una página de manual para el compilador de Scala, no para el intérprete. –

+1

La manera más fácil de ver qué es lo que el compilador y demás soportan es desde la línea de comando. 'scala -help' o' scalac -help' para ver las opciones "normales", luego 'scalac -X' para ver las opciones" avanzadas "y' scalac -Y' para ver las opciones "privadas". –

+0

@PaulButcher ¡Gracias! –

1

Si está utilizando IntelliJIDEA, para mostrar la acción Tipo de Información en el Editor, navegue hasta el valor y pulse Alt + = para Windows y Ctrl + Shift + P para Mac:

enter image description here

me resulta muy útil cuando la escritura de código.

Cuestiones relacionadas