Dart Iterable lazy函数变得太懒了
这个密码把我搞糊涂了。在这段代码中,takeWhile是有意义的——在余额为正的情况下接受借项,减少余额。问题是这段代码什么也没发生。没有调用balance.debit(),我想原因是过滤是惰性的 我可以通过附加toList()调用来确保它被调用,但这似乎是浪费,因为实际上并不需要列表Dart Iterable lazy函数变得太懒了,dart,Dart,这个密码把我搞糊涂了。在这段代码中,takeWhile是有意义的——在余额为正的情况下接受借项,减少余额。问题是这段代码什么也没发生。没有调用balance.debit(),我想原因是过滤是惰性的 我可以通过附加toList()调用来确保它被调用,但这似乎是浪费,因为实际上并不需要列表 有什么更好的方法可以做到这一点 takeWhile不是这项工作的合适工具吗 代码如下: 类平衡{ 平衡(此为.\u平衡); 双平衡; 借方(双倍金额){ 打印(“借记美元金额”); 返回(_余额-=金额);
- 有什么更好的方法可以做到这一点
- takeWhile不是这项工作的合适工具吗
类平衡{
平衡(此为.\u平衡);
双平衡;
借方(双倍金额){
打印(“借记美元金额”);
返回(_余额-=金额);
}
}
main(){
最终余额=新余额(3.0);
最终借项=[1.0,2.0,3.0];
借方.借方((借方)=>余额.借方(借方)>0);
//////////////////////
//借项
//.takeWhile((借方)=>余额。借方(借方)>0)
//.toList();
}
你是对的,这是因为它是惰性的。您需要一些强制对结果进行迭代的东西。如果不想创建列表,还可以执行以下操作:
var r=借方.takeWhile((借方)=>余额.借方(借方)>0);
对于(r中的变量x){
//印刷品(x);
}
api文档中描述了该行为:
过滤是惰性的
要强制执行评估,您可以对
takeWhile(…)
的结果使用.length
、.forEach(({})
)、.toList()
(…)进行评估,而takeWhile(…)否,takeWhile
不是此作业的正确工具
正如你所注意到的,它是懒惰的。它旨在创建一个新的iterable,并且只有在您实际使用该iterable时,它才会执行某些操作。在这里,你对结果一点也不感兴趣,所以你只想要“while”部分,而不关心“take”。备选方案:
for(借方中的借方){
如果(余额)借方(借方)<0)中断;
}
我甚至发现它更容易阅读。这是Dart分析器可以训练用来标记的东西吗(例如“警告:代码不起任何作用”)?以下哪种备选方案对性能的影响最小?在Iterable上有一个名为(.iterate()或.noop()或.doIt())的新方法,这样用户就可以强制使用它,而不必计算项目数、对每个项目调用noop或创建列表?