Dlang: цикл foreach или «каждый» шаблон - PullRequest
0 голосов
/ 10 сентября 2018

Скажем, у меня есть итеративный массив объектов, и я хочу перебрать каждый из этих объектов и выполнить какую-то задачу или задачи. Я вижу два способа сделать это, которые перечислены ниже. Я рассчитал оба с использованием MonoTime, и они кажутся сопоставимыми по времени выполнения.

Какой из этих параметров рекомендуется для использования в D? И в каких случаях рекомендуемый вариант может оказаться бесполезным?

    int[] animals = [animal1, animal2, animal3];

    // OPTION 1

    foreach(Animal a; animals) {
        a.feed();
        a.giveWater();
    }

    // OPTION 2
    animals.each!( (a) {a.feed();
                        a.giveWater();
                        });

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Я использую each для непосредственного вызова функции.

Например:

[1, 2, 3].each!writeln();
0 голосов
/ 10 сентября 2018

foreach является значением по умолчанию.

Единственное, для чего я бы использовал each, - это применение большого количества преобразований к коллекции (с помощью алгоритма std.algorithm), а затем итерация по результату. Это только для удобства чтения. Подумайте, хотите ли вы повторить следующее:

students
    .filter!(s => s.year == 1)
    .map!(s => s.major)
    .filter!(m => m !is null)
    .map!(x => faculty.byProgram(x))
    .joiner
    .array
    .sort
    .uniq

Было бы неловко помещать это в foreach. Было бы естественно прикрепить на .each!(x => writeln(x.name)).

...