2011-12-24 10 views
6

observar el siguiente código¿Por qué no puedo omitir "apply" en this.apply (_) en Scala?

trait Example { 
    type O 
    def apply(o: O) 
    def f(o: O) = this.apply(o) 
} 

el cual compila bien en Scala. Esperaría que puedo omitir apply como de costumbre, escribiendo def f(o: O) = this(o). Sin embargo, esto resulta en el emocionante mensaje de error

type mismatch; found : o.type (with underlying type Example.this.O) 
       required: _31.O where val _31: Example 
possible cause: missing arguments for method or constructor 

¿Alguien me puede explicar lo que está pasando?

Respuesta

4

La respuesta aceptada es incorrecta. Se puede inferir cuál es el problema real es el hecho de que esta compila bien:

trait Example { 
    def apply(o: String): String = o 
    def f(o: String) = this(o) 
} 

esto (...) sólo representa una llamada a un constructor cuando el sitio de compra es un constructor auxiliar. El resto del tiempo es un llamado para postularte, tal como lo imaginaste.

+0

lo siento, no estoy logrando inferir cuál es el problema real, pero entiendo su punto. ¿Podrías explicar más? –

+0

Es un error con tipos abstractos. Observe que el ejemplo no compilador funciona si el tipo O es concreto (por ejemplo, "escriba O = String") o si lo convierte en un parámetro de tipo en su lugar (por ejemplo, "rasit Example [O]".) – extempore

+0

¿conoce usted el número de problema para este error? –

11

Ti porque este() dentro de un constructor no puede es una llamada al constructor de este objeto (este() en otro sitio genera un fallo de compilación) y no se puede convertir en un apply() llamada ya que escondería el constructor y haría imposible llamar a otro constructor en su objeto. esto (args) es siempre una llamada a un método de constructor (tanto en Java como en Scala), por lo que cuando se encuentre dentro de su propio objeto, siempre debe llamar explícitamente apply (args).

+0

¡Huh! Por supuesto, gracias. Estaba confundido acerca de esto porque en mis ejemplos tenía un alias para 'this' (por ejemplo' caracter ejemplo {f => ...} '), y de alguna manera es mucho menos obvio que' f (o) 'es una llamada a un constructor –

Cuestiones relacionadas