D 惰性目录迭代的好处是什么?

D 惰性目录迭代的好处是什么?,d,lazy-evaluation,D,Lazy Evaluation,我正在阅读Phobos文档,找到了一个方法,该方法惰性地迭代给定的目录。但我不明白它的真正好处 据我所知,惰性函数是指只在需要时才计算的函数 让我们看下一个代码: auto files = dirEntries(...); auto cnt = files.count; foreach( file; files ) { } 会调用多少次dirEntries?一两个?请给我解释一下逻辑 比如说 对我来说,这会使代码更难理解。如果正确使用,惰性计算会更有效 假设您有一个执行某些操作的功能,价格

我正在阅读Phobos文档,找到了一个方法,该方法惰性地迭代给定的目录。但我不明白它的真正好处

据我所知,惰性函数是指只在需要时才计算的函数

让我们看下一个代码:

auto files = dirEntries(...);
auto cnt = files.count; 
foreach( file; files ) {  }
会调用多少次dirEntries?一两个?请给我解释一下逻辑

比如说


对我来说,这会使代码更难理解。

如果正确使用,惰性计算会更有效

假设您有一个执行某些操作的功能,价格有些昂贵,您可以将其应用于整个范围:

auto arr = iota(0, 100000); // a range of numbers from 0 to 100000
arr.map!(number => expensiveFunc(number))
   .take(5)
   .writeln;
如果map不是懒惰的,它将对范围内的所有100000个项目执行expensiveFunc,然后弹出前5个项目

但是因为map是惰性的,所以只会对从范围中实际弹出的5个项目调用expensiveFunc

与splitter类似,假设您有一个csv字符串,其中包含一些数据,并且希望继续求和值,直到遇到负值为止

string csvStr = "100,50,-1,1000,10,24,51"

int sum;
foreach(val; csvStr.splitter(",")){
    immutable asNumber = val.to!int;
    if(asNumber < 0) break;
    sum += asNumber;
}
writeln(sum);
上面只会做3次昂贵的“拆分”工作,因为拆分器是懒惰的,我们只需要阅读3项。使我们不必一直拆分csvStr直到最后,即使我们不需要它们

因此,总的来说,懒惰评估的好处在于,只有需要完成的工作才真正完成了