2012-05-01 11 views

risposta

4

Non c'è un modo pulito per farlo utilizzando le librerie di base come lo sono ora, ma se si tira il proprio foldLeft poi c'è

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; 
} 

Ho parlato con la squadra Dart sull'aggiunta foldLeft alle collezioni core e spero che ci sarà presto.

+0

Questo potrebbe essere risolto aggiungendo una funzione di inject all'interfaccia di raccolta come in Ruby. –

+1

Ecco un codice molto carino lì, Lars. Non solo era quello che stavo cercando, ora capisco pieghevole. –

+1

Si può certamente farlo con una funzione anonima, con o senza codice di libreria per farlo, semplicemente inserendo il codice in foldLeft sopra. E praticamente avrai sempre bisogno di una variabile, a meno che tu non sia eccessivamente intelligente con la ricorsione. In alternativa, puoi anche farlo con un valore for (var each in ...) piuttosto che for e applicare la funzione nel corpo del ciclo for. O funziona. –

4

Continuo a pensare che il modo più ovvio sia più pulito e più facile da capire per questo particolare problema.

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 nomi di variabili più brevi per renderlo occupano meno spazio:

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