2012-12-28 23 views
7

Come definire la funzione letterale con più argomenti impliciti in Scala? Ho provato in questo modo:Funzione letterale con più argomenti impliciti

def create = authAction { (implicit request, user) ⇒ // Syntax error 
    Ok(html.user.create(registrationForm)) 
} 

ma genera errore di compilazione.

+0

Potresti per favore approfondire il contesto del tuo codice o dare un esempio più autonomo? Ciò renderebbe più facile verificare cosa non funziona con il tuo caso. Non posso dire dove 'authAction',' Ok', 'html' sono definiti in questo momento. Stai usando * Play! * O * Lift * o qualcos'altro? Grazie –

+0

Sì, il mio frammento dell'applicazione Play funziona, ma con entrambi gli argomenti il ​​codice implicito sarebbe più pulito. – lambdas

risposta

16

Come indicato nella risposta precedente, è possibile definire un solo parametro implicito per una funzione letterale, ma non c'è soluzione.

Invece di più argomenti impliciti è possibile scrivere letterale di funzione come se si trattino più elenchi di argomenti con un argomento ciascuno. Quindi è possibile contrassegnare ogni argomento come implicito. Riscrittura frammento originale:

def create = authAction { implicit request ⇒ implicit user ⇒ 
    Ok(html.user.create(registrationForm)) 
} 

Si può chiamare da authAction come f(request)(user).

implicit la duplicazione delle parole chiave è fastidiosa, ma almeno funziona.

6

Da quello che posso capire delle specifiche del linguaggio, dalla versione 2.9.2 è possibile definire un solo parametro implicito per le funzioni anonime.

E.g.

val autoappend = {implicit text:String => text ++ text} 
+4

+1 Vedi SLS 6.23 – paradigmatic

+0

Qualcuno sa perché questo è il caso? Sembra una specie di arbitrario. – cdmckay

0

Appena avuto una situazione simile a te, implementando una funzione authAction in Play che avrebbe facilmente passato un utente in. Puoi farlo come lambdas did it, con currying; Ho finito per fare la mia funzione authAction ricevere il RequestHeader implicitamente, ma passano sia richiesta e l'utente in modo esplicito:

def authAction(f: (RequestHeader, User) => Result)(implicit request: RequestHeader) = { 
    ... 
    val authUser = loadUser(...) 
    f(request, authUser) 
} 

E usarlo:

def create = authAction { (request, user) => 
    Ok(html.user.create(registrationForm)) 
} 
0

Non v'è alcun modo per definire una funzione anonima con più parametri impliciti.

per approfondire @ risposta e di pagoda_5b @ di paradigmatico commento, sezione 6.23 del Scala Language Specification definisce le funzioni anonime in questo modo:

Expr ::= (Bindings | [‘implicit’] id | ‘_’) ‘=>’ Expr 
ResultExpr ::= (Bindings | ([‘implicit’] id | ‘_’) ‘:’ CompoundType) ‘=>’ Block 
Bindings ::= ‘(’ Binding {‘,’ Binding} ‘)’ 
Binding ::= (id | ‘_’) [‘:’ Type] 

Come si può vedere, è possibile definire un elenco di parametri o un singolo parametro implicito.

Se sono necessari più parametri per essere impliciti, è necessario eseguirne il curry.

Problemi correlati