2012-06-22 24 views
8

Cuando uso el rasgo App de scala, no puedo hacer que println funcione.Scala println no funciona con el rasgo de aplicación

Este simple ejemplo imprime como se esperaba,

object HelloWorld { 
    def main(args: Array[String]) { 
    println("Hello, world!") 
    } 
} 

Pero una vez que presento el rasgo no es así,

object HelloWorld extends App { 
    println("Hello, world!") 
} 

me sale ningún error pero no se imprime nada a la consola.

Respuesta

10

¿Lo compiló primero (ejecutando scalac HelloWorld.scala)? Ver este comentario: http://www.scala-lang.org/node/9483#comment-40627

Editado para agregar más explicación: La primera versión fue realmente compilada. Los archivos Scala sin un método principal explícito se ejecutan sin compilar como scripts. Eso significa que para su segunda versión, los comandos del archivo se ejecutan de forma secuencial, como si se hubieran ingresado en el intérprete, por lo que se crea el objeto HelloWorld, pero no se le pide ningún método. Hay más información sobre Scala como un lenguaje de script aquí (desplácese al Paso 5): http://www.artima.com/scalazine/articles/steps.html

+0

Extraño. Parece una extraña limitación para el intérprete. ¿Hay alguna explicación de por qué necesito compilar la clase para que funcione? ¿Los rasgos simplemente no funcionan en el intérprete? –

+1

Y los rasgos funcionan en el intérprete, pero la aplicación es un tipo de caso especial. A menudo se presenta como "La aplicación ajusta el código dentro de su objeto de implementación en un método principal", pero eso no es realmente, sino que pega ese código en algo llamado "delayInit", que se invoca cuando se llama al método principal en lugar de cuando se crea objeto, que normalmente es cuando se llama código desnudo dentro de una declaración de objeto. –

+0

Ah, eso tiene sentido, gracias por la explicación. –

5

Añadir una línea

object HelloWorld extends App { 
    /* code */ 
} 

HelloWorld.main(args) 

al final de su archivo.

La clase define el método pero también debe llamarse.

Cuestiones relacionadas