ленивая оценка может быть намного более эффективной при правильном использовании.
Скажем, у вас есть несколько дорогостоящую функцию, которая делает что-то и применить его к целому ряду:
auto arr = iota(0, 100000); // a range of numbers from 0 to 100000
arr.map!(number => expensiveFunc(number))
.take(5)
.writeln;
Если карта не поленился, он бы выполнить expensiveFunc
для всех 100000 элементов в диапазоне, и затем вытащите первые 5 из них.
Но поскольку карта ленива, дорогойFunc будет вызван только для 5 предметов, которые действительно выскочили из диапазона.
Аналогично с разделителем, скажем, у вас есть строка 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 до конца, даже если они нам не нужны.
Итак, в общем, прибыль от ленивой оценки заключается в том, что только работа, которую НУЖДАЕТСЯ, на самом деле делается.