2011-09-02 10 views
13

Según this, los métodos de Scala pertenecen a una clase. Sin embargo, si defino un método en REPL o en un script que luego ejecuto usando scala, ¿a qué clase pertenece el método?Scala: ¿Hay una clase predeterminada si no se define ninguna clase?

scala> def hoho(str:String) = {println("hoho " + str)} 
hoho: (str: String)Unit 

scala> hoho("rahul") 
hoho rahul 

En este ejemplo, ¿a qué clase pertenece el método?

Respuesta

17

El REPL envuelve todas sus declaraciones (en realidad reescribe sus declaraciones) en objetos automágicamente. Puede verlo en acción si se imprime el código intermedio mediante la opción -Xprint:typer:

scala> def hoho(str:String) = {println("hoho " + str)} 
[[syntax trees at end of typer]]// Scala source: <console> 
package $line1 { 
    final object $read extends java.lang.Object with ScalaObject { 
    def this(): object $line1.$read = { 
     $read.super.this(); 
    () 
    }; 
    final object $iw extends java.lang.Object with ScalaObject { 
     def this(): object $line1.$read.$iw = { 
     $iw.super.this(); 
     () 
     }; 
     final object $iw extends java.lang.Object with ScalaObject { 
     def this(): object $line1.$read.$iw.$iw = { 
      $iw.super.this(); 
     () 
     }; 
     def hoho(str: String): Unit = scala.this.Predef.println("hoho ".+(str)) 
     } 
    } 
    } 
} 

Así que su método es realmente hoho$line1.$read.$iw.$iw.hoho. Luego, cuando use hoho("foo") más adelante, se reescribirá para agregar el paquete y los objetos externos.

Notas adicionales: para secuencias de comandos, -Xprint:typer (-Xprint:parser) revela que el código se envuelve dentro de un bloque de código en la main(args:Array[String]) de un objeto Main. Usted tiene acceso a los argumentos como args o argv.

+0

Gracias. ¿Ocurre lo mismo si guardo la definición del método en un script .scala y lo ejecuto usando scala ? – Rahul

+0

@Rahul, he agregado la información para el script, el mecanismo es diferente. – huynhjl

Cuestiones relacionadas