2012-01-26 14 views

Respuesta

6

La razón de esto es que los paréntesis para una llamada de función (invocación) son opcionales. Encuentro esto una confusión constante en mi propio código y tengo una política general de incluir siempre paréntesis para dejarlo en claro.

En script de café, si omite el paréntesis, supone que la lista de argumentos va al final de la línea. Su primer script de ejemplo el café es en realidad lo mismo que esto:

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

donde el primer argumento de la llamada al mapa es una función (i)->i*2

Si elimina el espacio entre el mapa y el (i) a continuación, El script de café implica paréntesis alrededor del resto de la línea. Su segundo script de ejemplo el café es en realidad lo mismo que esto:

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

Aquí se puede ver que el mapa se está llamando con i como el único argumento y luego coffeescript está esperando la llamada map(i) para devolver una función que es entonces llamándose pasando ->i*2 o para ser más explícito ()->i*2 como argumento.

Dado que coffee script está diseñado para eliminar los posibles riesgos de codificación de javascript, creo que hubiera sido mucho más seguro si no hubieran incluido este paréntesis implícito.

4

El map(i) en el segundo se interpreta como una llamada de función. El JavaScript sale así:

var nums; 

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

y que no tiene ningún sentido, porque map no devuelve una función y no hay i definido.

En el primero, el espacio lo convierte en [1..10].map((i) -> i*2) por lo que termina llamando a map con una función como argumento; el JavaScript en este caso se ve así:

var nums; 

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

Me encanta CoffeeScript. No me malinterpreten ... pero este tipo de problema de espacio en blanco me irrita. Desde una perspectiva de legibilidad, parece que no debería importar ... pero lo hace. Esta es la razón por la que cada vez que se me ocurre esta ambigüedad percibida, a menudo la elimino y escribo: 'map ((i) -> i * 2)' para que no pueda interpretarse accidentalmente incorrectamente. –

+1

Voy a ir más allá de Brian, para evitar este tipo de cosas, mi equipo y yo hemos decidido no utilizar la capacidad de CoffeeScript para dejar los paréntesis para las llamadas de función. Dejo los parens en las cláusulas 'if' y en otros lugares donde javascript requiere un predicado para ser envuelto en parens. Pero los uso para todas las llamadas a funciones. Escribo '() ->' en lugar de simplemente '->'. Para su instancia, lo escribiría como Brian, '... map ((i) -> i * 2)'; mucho más legible en mi opinión. –

+1

No estoy convencido de esos espacios interiores entre paréntesis, personalmente escribo: 'xs.map ((x) -> x * 2)'.De lo contrario, estoy de acuerdo con los dos, el estilo sin par parece genial al escribir código de estilo DSL, pero al escribir el código "normal" terminas teniendo problemas (esto también ocurre en Ruby, por ejemplo). El uso de parenthenses tiene otra ventaja: puede escribir bloques multicadena de estilo Ruby concadenables que se vean bastante bien (usando ')' ya que hubo 'end's). – tokland

Cuestiones relacionadas