Глядя на сообщение Карла Сегуина, в котором он показывает, как проектирование с учетом тестируемости приводит к лучшему дизайну, в данном случае композиция превышает наследование .
В этом примере его 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
Нет. Вы не можете последним
, следующим
и т. д. из карты
, grep
или сортировать
блоки, потому что это не петли.
Сказав это, фрагмент кода в вопросе является плохой практикой, потому что map
никогда не следует вызывать в пустом контексте. Их предполагается использовать для преобразования одного списка в другой.
Вот лучший способ написать это, если вам действительно нужно встроить его (изменено после комментария ysth):
$_ == 10 && last, print for 1..15; # prints '123456789'
Вы можете использовать длинный прыжок (пара eval
/die
), чтобы выйти из любой вложенной конструкции, которая не поддерживает ее напрямую:
eval { map{ die if test; dosomething } @myarray };
Но, как сказал Зайд, использование цикла for
/foreach
в этом случае лучше, потому что вы не используете возвращаемое значение map
.
Вам нужен цикл for:
foreach ( @myarray ) {
last if test;
...
}
Он делает то же самое. map
предназначен для преобразования одного списка в другие списки.
Существуют конструкции, похожие на карты, которые делают именно то, что вам нужно. Взгляните на 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 в соответствии с предыдущими ответами.
Нет. Используйте порядковый цикл foreach
и оператор last
.
Начиная с версии 5.8.1, map является контекстно-зависимой — в пустом контексте списки не создаются. В любом случае map обычно используется для получения списка из другого списка, оценивая expr для каждого элемента исходного списка.
Вы можете использовать блок do с модификатором оператора for:
do {
last if test;
dosomething;
} for (@myarray);
Хотя использование блока foreach, вероятно, было бы понятнее, и будущие сопровождающие вашего кода будут вам благодарны.
foreach (@myarray) {
last if test;
dosomething;
}