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

时间:2016-09-07 06:32:16

标签: d lazy-evaluation

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

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

让我们看看下一个代码:

auto files = dirEntries(...);
auto cnt = files.count; 
foreach( file; files ) {  }

dirEntries会被调用多少次?一个或两个?请解释我的逻辑。

或者例如splitter

对我而言,让代码更难理解。

1 个答案:

答案 0 :(得分:7)

如果使用得当,延迟评估会更有效率。

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

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

如果地图不是懒惰的,它会对范围内的所有100000个项目执行expensiveFunc,然后弹出前5个项目。

但是因为地图是懒惰的,所以只会为实际从该范围中弹出的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);

以上只会做昂贵的分裂&#39;工作3次,因为分裂器是懒惰的,我们只需阅读3个项目。除非我们不需要将csvStr拆分到最后,否则我们就不用了。

因此,总而言之,懒惰评估的好处是只有需要要完成的工作才能完成。