这段代码让我兴奋不已。在此代码中, takeWhile 是有意义的 - 占用借方,在余额为正时减少余额。问题是这个代码没有任何反应。没有调用 balance.debit(),我猜原因是 takeWhile过滤懒洋洋地发生。
我可以确保通过添加 toList()调用来调用它,但这似乎很浪费,因为实际上并不需要列表。
代码如下:
class Balance {
Balance(this._balance);
double _balance;
debit(double amount) {
print('Debiting $amount');
return (_balance -= amount);
}
}
main() {
final balance = new Balance(3.0);
final debits = [ 1.0, 2.0, 3.0 ];
debits.takeWhile((debit) => balance.debit(debit) > 0);
//////////////////////
//debits
// .takeWhile((debit) => balance.debit(debit) > 0)
// .toList();
}
答案 0 :(得分:4)
不,takeWhile
不适合这项工作。
正如你所注意到的,它是懒惰的。它旨在创建一个新的可迭代,并且只有在您实际使用该可迭代时才会执行某些操作。在这里,你根本不对结果感兴趣,所以你只需要" while"部分,并不关心"采取"。替代方案:
for (debit in debits) {
if (balance.debit(debit) < 0) break;
}
我甚至发现它更容易阅读。
答案 1 :(得分:3)
Iterable.takeWhile的api文档中描述了这种行为:
过滤很懒散。
要执行评估,您可以对.length
.forEach((_){})
,.toList()
,takeWhile(...)
(...)
答案 2 :(得分:2)
你是对的,这是因为它是懒惰的评估。你需要一些强制迭代结果的东西。如果您不想创建列表,您还可以执行以下操作:
var r = debits.takeWhile((debit) => balance.debit(debit) > 0);
for(var x in r) {
// print(x);
}