Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart Iterable lazy函数变得太懒了_Dart - Fatal编程技术网

Dart Iterable lazy函数变得太懒了

Dart Iterable lazy函数变得太懒了,dart,Dart,这个密码把我搞糊涂了。在这段代码中,takeWhile是有意义的——在余额为正的情况下接受借项,减少余额。问题是这段代码什么也没发生。没有调用balance.debit(),我想原因是过滤是惰性的 我可以通过附加toList()调用来确保它被调用,但这似乎是浪费,因为实际上并不需要列表 有什么更好的方法可以做到这一点 takeWhile不是这项工作的合适工具吗 代码如下: 类平衡{ 平衡(此为.\u平衡); 双平衡; 借方(双倍金额){ 打印(“借记美元金额”); 返回(_余额-=金额);

这个密码把我搞糊涂了。在这段代码中,takeWhile是有意义的——在余额为正的情况下接受借项,减少余额。问题是这段代码什么也没发生。没有调用balance.debit(),我想原因是过滤是惰性的

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

  • 有什么更好的方法可以做到这一点
  • 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或创建列表?