2010-09-01 10 views
5

Cuando trato de omitir puntos de invocaciones de métodos, como en este programa de ejemplo:¿Qué significa "método recursivo <method name> necesita tipo" en Scala?

object Test extends Application { 
    val baz = new Baz 
    var foo = baz bar 
    println(foo) 
} 

class Baz { 
    def bar = "bar" 
} 

recibo errores extraños. El primero es error: recursive method foo needs type: println foo y el otro es error: type mismatch; found: Unit, required: Int, println(foo). El primer error se soluciona de alguna manera extraña si especifico que el tipo de foo debe ser String. El segundo no desaparecerá antes de poner un punto entre baz y bar. ¿Cuál es la causa de esto? ¿Por qué Scala piensa que baz bar es un método recursivo?

+0

Similar: http://stackoverflow.com/questions/2246212/why-does-scalas-semicolon-inference-fail-here – missingfaktor

Respuesta

7

El problema que está viendo es que si omite los puntos, el código es ambiguo. El compilador tratar la expresión como

var foo = baz.bar(println(foo)) 

así foo se define de forma recursiva y StringOps.apply método necesita un argumento Int (String se convertirá implícitamente a StringOps como String tiene ningún método apply).

Solo debe usar la sintaxis del operador al llamar a métodos que toman un argumento que no es Unit para evitar tales ambigüedades.

+0

Muchas gracias por la respuesta. No tenía idea de que Scala trataría de juntar líneas así. Pensé que trataba los saltos de línea como un punto y coma. Experimenté un poco, y el problema también podría resolverse insertando un punto y coma después de 'val foo = baz bar'. – mranders

+0

Scala normalmente trata los saltos de línea como espacios en blanco, pero el compilador intenta deducir puntos y comas donde sea necesario. En su caso, esto no funciona bien junto con la inferencia de tipo. – Moritz