2012-06-28 13 views

risposta

5

Questa è la versione più leggibile di quella senza ottenere eccessivamente lungo:

names = 
    (for mail in @data when mail.service_name is service.name 
    mail.folder).unique() 

Non è possibile dividere list comprehension su più righe, ma un normale ciclo for può anche restituire un valore, in modo da utilizzare uno di quelli risolve il problema. Se siete disposti a concedere una riga in più, non c'è bisogno per le parentesi scomode di tutto il ciclo:

names = 
    for mail in @data when mail.service_name is service.name 
    mail.folder 
names = names.unique() 

Infine, il rientro della linea for è a voi; Ho trovato la mia prima versione più leggibile ma questo è valido anche:

names = 
(for mail in @data when mail.service_name is service.name 
    mail.folder).unique() 
4

Questo compiles fine:

names = (mail.folder for mail in @data \ 
     when mail.service_name is service.name).unique() 

È anche possibile invertire la for ... when e l'espressione:

names = (for mail in @data when mail.service_name is service.name 
      mail.folder).unique() 
+0

ottengo * Errore di analisi ON LINE 1: INATTESO 'trattino' * sulla vostra prima soluzione. La tua seconda soluzione sembra funzionare bene. – jackwanders

+0

@jackwanders Sì, hai ragione, non so come mi sono perso: S. L'ho risolto ora con un continuatore di riga '\'. Funziona in questo modo? (il link mostra un exmaple aggiornato in coffeescript.org) – epidemian

+0

Mi piace la \ soluzione: list comprehension + più leggibile – Alexander

Problemi correlati