2012-01-26 6 views

risposta

6

Il motivo è che le parentesi per una chiamata di funzione (invocazione) sono facoltative. Trovo questa costante confusione nel mio codice e ho una politica generale di includere sempre le parentesi per chiarire.

Nella sceneggiatura del caffè, se si omette la parentesi, si presuppone che l'elenco degli argomenti vada alla fine della riga. Il tuo primo script di esempio il caffè è in realtà lo stesso di questo:

nums = [1..10].map((i) -> i*2) 

in cui il primo argomento della chiamata per mappare è una funzione (i)->i*2

Se si rimuove lo spazio tra la mappa e il (i), allora la sceneggiatura del caffè implica parentesi attorno al resto della linea. Il tuo secondo script di esempio il caffè è in realtà lo stesso di questo:

nums = [1..10].map(i)(-> i*2) 

Qui si può vedere che mappa viene chiamato con i come unico argomento e quindi lo script caffè si aspetta la chiamata map(i) per restituire una funzione che viene poi essere chiamato passando ->i*2 o essere più esplicito ()->i*2 come argomento.

Dato che lo script di caffè è progettato per rimuovere i potenziali rischi di codifica di javascript, penso che sarebbe stato molto più sicuro se non avessero incluso questa parentesi implicita.

4

Il map(i) nel secondo viene interpretato come una chiamata di funzione. Il codice JavaScript viene fuori in questo modo:

var nums; 

nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(i)(function() { 
    return i * 2; 
}); 

e che non ha alcun senso perché map non restituisce una funzione e non c'è i definito.

Nella prima, lo spazio si trasforma in [1..10].map((i) -> i*2) così si finisce per chiamare map con una funzione come argomento; il JavaScript in questo caso assomiglia a questo:

var nums; 

nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map(function(i) { 
    return i * 2; 
}); 
+0

Amo CoffeeScript. Non fraintendermi ... ma questo tipo di problema degli spazi bianchi mi infastidisce. Da una prospettiva di leggibilità, sembra che non dovrebbe importare ... ma lo fa. Questo è il motivo per cui ogni volta che viene fuori questa ambiguità percepita, spesso la rimuovo e scrivo: 'map ((i) -> i * 2)' in modo che non possa essere interpretata erroneamente. –

+1

Andrò uno oltre Brian, per evitare questo genere di cose la mia squadra e ho deciso di non utilizzare la capacità di CoffeeScript di lasciare fuori le parentesi per chiamate di funzione. Lascio il paren nelle clausole 'if' e in altri luoghi in cui javascript richiede che un predicato sia avvolto in parentesi. Ma li uso per tutte le chiamate di funzione. Scrivo '() ->' piuttosto che solo '->'. Per la tua istanza, scriverei proprio come Brian, '... map ((i) -> i * 2)'; molto più leggibile secondo me. –

+1

Non sono convinto di quegli spazi interiori tra parentesi, personalmente scriverò: 'xs.map ((x) -> x * 2)'.Altrimenti sono d'accordo con entrambi, lo stile parentesi-meno sembra interessante quando si scrive codice in stile DSL, ma quando si scrive codice "normale" si finisce per avere problemi (questo accade anche in Ruby, ad esempio). L'utilizzo di parenthenses ha un altro vantaggio: puoi scrivere blocchi concatenabili a più righe in stile Ruby che sembrano abbastanza bene (usando ')' come c'erano 'end's). – tokland

Problemi correlati