Композиция с StructureMap

Глядя на сообщение Карла Сегуина, в котором он показывает, как проектирование с учетом тестируемости приводит к лучшему дизайну, в данном случае композиция превышает наследование .

В этом примере его CachedEmployeeLookup имеет зависимость от EmployeeLookup , которые реализуют один и тот же интерфейс, IEmployeeLookup

Как вы настроили бы это в StructureMap, чтобы что программа по умолчанию использует класс CachedEmployeeLookup , в то время как CachedEmployeeLookup получает EmployeeLookup , введенный в него? Есть ли что-то вроде `last` для` map`? Можно ли в Perl произвольно завершить выполнение карты, например что-то эквивалентное последнему в цикле? Это было бы примерно так: map {if (test == true) {last; } сделай что-нибудь } @myarray

Можно ли в Perl произвольно завершить выполнение map , например, что-то эквивалентное last в цикле?

Это было бы примерно так :

map {
    if (test == true) { last; } dosomething
} @myarray

13
задан daxim 26 August 2010 в 14:41
поделиться

6 ответов

Нет. Вы не можете последним, следующим и т. д. из карты, grep или сортировать блоки, потому что это не петли.

Сказав это, фрагмент кода в вопросе является плохой практикой, потому что map никогда не следует вызывать в пустом контексте. Их предполагается использовать для преобразования одного списка в другой.

Вот лучший способ написать это, если вам действительно нужно встроить его (изменено после комментария ysth):

 $_ == 10 && last, print for 1..15;  # prints '123456789'
19
ответ дан 1 December 2019 в 20:42
поделиться

Вы можете использовать длинный прыжок (пара eval/die), чтобы выйти из любой вложенной конструкции, которая не поддерживает ее напрямую:

eval { map{ die if test; dosomething } @myarray };

Но, как сказал Зайд, использование цикла for/foreach в этом случае лучше, потому что вы не используете возвращаемое значение map.

2
ответ дан 1 December 2019 в 20:42
поделиться

Вам нужен цикл for:

foreach ( @myarray ) { 
    last if test;
    ...
}

Он делает то же самое. map предназначен для преобразования одного списка в другие списки.

2
ответ дан 1 December 2019 в 20:42
поделиться

Существуют конструкции, похожие на карты, которые делают именно то, что вам нужно. Взгляните на List::Util и List::MoreUtils (удобно также упакованные вместе как List::AllUtils):

use List::MoreUtils 'first';

# get first element with a {foo} key
my $match = map { $_->{foo} eq 'some string' } @elements;

Если вы не Не хотите извлекать элементы из списка, а затем используйте foreach в соответствии с предыдущими ответами.

1
ответ дан 1 December 2019 в 20:42
поделиться

Нет. Используйте порядковый цикл foreach и оператор last.

Начиная с версии 5.8.1, map является контекстно-зависимой — в пустом контексте списки не создаются. В любом случае map обычно используется для получения списка из другого списка, оценивая expr для каждого элемента исходного списка.

3
ответ дан 1 December 2019 в 20:42
поделиться

Вы можете использовать блок do с модификатором оператора for:

do {
   last if test;
   dosomething;
} for (@myarray);

Хотя использование блока foreach, вероятно, было бы понятнее, и будущие сопровождающие вашего кода будут вам благодарны.

foreach (@myarray) {
   last if test;
   dosomething;
}
3
ответ дан 1 December 2019 в 20:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: