懒惰目录迭代的利润是多少?

Dmi*_*kov 0 d lazy-evaluation

我正在阅读Phobos文档并找到完成"懒惰迭代给定目录"的方法dirEntries.但我无法理解它的真正利润.

据我所知,懒惰函数意味着仅在需要时计算的函数.

我们来看下一个代码:

auto files = dirEntries(...);
auto cnt = files.count; 
foreach( file; files ) {  }
Run Code Online (Sandbox Code Playgroud)

dirEntries会叫多少次?一个或两个?请解释我的逻辑.

或者例如分离器

对我而言,使代码更难以理解.

Col*_*gan 7

如果使用正确,延迟评估可以更有效.

假设你有一个有点昂贵的功能,你可以将它应用到整个范围:

auto arr = iota(0, 100000); // a range of numbers from 0 to 100000
arr.map!(number => expensiveFunc(number))
   .take(5)
   .writeln;
Run Code Online (Sandbox Code Playgroud)

如果map不是lazy,它将expensiveFunc对该范围内的所有100000个项执行,然后弹出前5个.

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

与分割器类似,假设您有一个带有一些数据的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);
Run Code Online (Sandbox Code Playgroud)

以上只会进行3次昂贵的"分裂"工作,因为分离器是懒惰的,我们只需阅读3个项目.即使我们不需要它们,也不必将csvStr分开到最后.

因此,总之,懒惰评估的利润是只需要完成的工作才能完成.