convertir - Comprensiones de matrices anidadas en CoffeeScript
js to coff (2)
En primer lugar, diría que la comprensión de 2 matrices en línea no es un patrón que se pueda mantener. Así que vamos a descomponerlo un poco.
cross = (A, B) ->
for a in A
for b in B
a+b
alert JSON.stringify(cross [1,2], [3,4])
Lo que ocurre aquí es que el interior crea un cierre, que tiene su propio colector de comprensión. Por lo tanto, ejecuta todas las b y luego devuelve los resultados como una matriz que se inserta en el recopilador de resultados de la comprensión primaria. Usted está esperando un valor de retorno de un bucle interno, que es un poco raro.
En su lugar, simplemente recogería los resultados yo mismo.
cross = (A, B) ->
results = []
for a in A
for b in B
results.push a + b
results
alert JSON.stringify(cross [1,2], [3,4])
O si todavía quieres hacer un poco de magia de comprensión loca:
cross = (A, B) ->
results = []
results = results.concat a+b for b in B for a in A
results
alert JSON.stringify(cross [1,2], [3,4])
Si esto es un error en CS o no es un poco discutible, supongo. Pero diría que es una buena práctica hacer un manejo de resultados de comprensión más explícito cuando se trata de iteradores anidados.
En pitón
def cross(A, B):
"Cross product of elements in A and elements in B."
return [a+b for a in A for b in B]
devuelve una matriz unidimensional si la llama con dos matrices (o cadenas).
Pero en CoffeeScript
cross = (A, B) -> (a+b for a in A for b in B)
devuelve una matriz bidimensional.
- ¿Crees que es por diseño en CoffeeScript o es un error?
- ¿Cómo aplanar arrays en CoffeScript?