2011-12-24 12 views
6

osservare il seguente codicePerché non posso omettere "apply" in this.apply (_) in Scala?

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

che compila bene a Scala. Mi aspetterei di lasciare fuori come al solito apply scrivendo def f(o: O) = this(o). Tuttavia, questo si traduce nel messaggio di errore emozionante

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 

Qualcuno può spiegarmi cosa sta succedendo?

risposta

4

La risposta accettata non è corretta. Si può dedurre quale sia il problema reale è il fatto che questo compila bene:

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

questo (...) rappresenta solo una chiamata a un costruttore quando il sito chiamata è un costruttore ausiliario. Il resto del tempo è una chiamata da applicare, proprio come hai immaginato.

+0

scusa, non riesco a dedurre quale sia il vero problema, ma vedo il tuo punto. Potresti spiegare ulteriormente? –

+0

È un bug con i tipi astratti. Si noti che l'esempio non di compilazione funziona se si esegue il tipo O concrete (ad esempio "type O = String") o se si rende invece un parametro di tipo (es. "Esempio di tratto [O]".) – extempore

+0

ti capita di conoscere il numero di rilascio di questo bug? –

11

Non è possibile perché questo() all'interno di un costruttore è una chiamata al costruttore di questo oggetto (questo() altrove genera un fallimento di compilazione) e non può essere trasformato in un applicare() chiamata in quanto nasconderebbe il costruttore e renderebbe impossibile chiamare un altro costruttore nel tuo oggetto. this (args) è sempre una chiamata a un metodo di costruzione (sia in Java che in Scala), quindi quando all'interno del proprio oggetto, è sempre necessario chiamare esplicitamente apply (args).

+0

Huh! Certo, grazie. Ero confuso su questo perché nei miei esempi avevo un alias per 'this' (ad esempio' trait Example {f => ...} '), e in qualche modo è molto meno ovvio che' f (o) 'è una chiamata a un costruttore. –

Problemi correlati