可遗传的懒惰函数变得过于懒惰

时间:2014-04-28 21:51:41

标签: dart

这段代码让我兴奋不已。在此代码中, takeWhile 是有意义的 - 占用借方,在余额为正时减少余额。问题是这个代码没有任何反应。没有调用 balance.debit(),我猜原因是 takeWhile过滤懒洋洋地发生

我可以确保通过添加 toList()调用来调用它,但这似乎很浪费,因为实际上并不需要列表。

  • 有什么更好的方法可以做到这一点?
  • takeWhile 不是这项工作的合适工具吗?

代码如下:

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

3 个答案:

答案 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);
}