Non mi piace utilizzare un array indicizzato per nessun altro motivo, a parte il fatto che penso che sia brutto. C'è un modo pulito per riassumere con una funzione anonima? È possibile farlo senza usare variabili esterne?Qual è il modo più pulito per ottenere la somma dei numeri in una raccolta/lista in Dart?
10
A
risposta
11
Dart iterables ora hanno una funzione di ridurre (https://code.google.com/p/dart/issues/detail?id=1649), in modo da puoi fare una somma in maniera concisa senza definire la tua funzione di piegatura:
var sum = [1, 2, 3].reduce((a, b) => a + b);
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.
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);
Questo potrebbe essere risolto aggiungendo una funzione di inject all'interfaccia di raccolta come in Ruby. –
Ecco un codice molto carino lì, Lars. Non solo era quello che stavo cercando, ora capisco pieghevole. –
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. –