2012-05-01 9 views

Respuesta

4

No hay una manera limpia de hacerlo utilizando las bibliotecas del núcleo como lo son ahora, pero si sacas tu propia foldLeft entonces hay

main() { 
    var sum = foldLeft([1,2,3], 0, (val, entry) => val + entry); 
    print(sum); 
} 

Dynamic foldLeft(Collection collection, Dynamic val, func) { 
    collection.forEach((entry) => val = func(val, entry)); 
    return val; 
} 

Hablé con el equipo dardo sobre la adición de foldLeft a las colecciones principales y espero que esté allí pronto.

+0

Esto podría abordarse agregando una función de inyección a la interfaz de colección como en Ruby. –

+1

Ese es un código muy bonito, Lars. No solo era lo que estaba buscando, ahora entiendo plegable. –

+1

Sin duda puede hacerlo con una función anónima, con o sin código de biblioteca para hacerlo, simplemente insertando el código en foldLeft arriba. Y casi siempre vas a necesitar una variable, a menos que seas excesivamente inteligente con recursividad. Alternativamente, también puede hacerlo con a para (var cada en ...) en lugar de para Each, y aplicar la función en el cuerpo del bucle for. Cualquiera de los dos funciona –

4

Sigo pensando que la manera obvia es más clara y más fácil de entender para este problema en particular.

num sum = 0; 
[1, 2, 3].forEach((num e){sum += e;}); 
print(sum); 

o

num sum = 0; 
for (num e in [1,2,3]) { 
    sum += e; 
} 
3
int sum = [1, 2, 3].fold(0, (previous, current) => previous + current); 

o con nombres de variables más cortos para que sea ocupan menos espacio:

int sum = [1, 2, 3].fold(0, (p, c) => p + c); 
Cuestiones relacionadas