2016-09-07 3 views
0

Я читаю документы Фобоса и нашел метод dirEntries, который завершает «лениво итерацию заданной директории». Но я не могу понять настоящую прибыль.Что такое прибыль от ленивой итерации каталогов?

Как я понимаю, функция «ленивая функция», которая вычисляется только в момент, когда она необходима.

Давайте посмотрим на следующий код:

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

Сколько раз dirEntries будет называться? Один или два? Пожалуйста, объясните мне логику.

Или, например splitter

Для меня это сделать код гораздо сложнее для понимания.

ответ

7

ленивая оценка может быть намного более эффективной при правильном использовании.

Скажем, у вас есть несколько дорогостоящую функцию, которая делает что-то и применить его к целому ряду:

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 до конца, даже если они нам не нужны.

Итак, в общем, прибыль от ленивой оценки заключается в том, что только работа, которую НУЖДАЕТСЯ, на самом деле делается.

Смежные вопросы