Условия выхода из цикла

Вы можете отключить страницу вложения медиафайлов в Yoast SEO, если вы ее установили. Или вы можете вставить это в ваши functions.php

function myprefix_redirect_attachment_page() {
if ( is_attachment() ) {
    global $post;
    if ( $post && $post->post_parent ) {
        wp_redirect( esc_url( get_permalink( $post->post_parent ) ), 301 );
        exit;
    } else {
        wp_redirect( esc_url( home_url( '/' ) ), 301 );
        exit;
    }
  }
}
add_action( 'template_redirect', 'myprefix_redirect_attachment_page' );
5
задан palm3D 25 September 2008 в 08:42
поделиться

12 ответов

Я склонен использовать вторую форму, просто потому что затем я могу быть более уверен, что цикл завершится. Т.е. более трудно представить ошибку незавершения путем изменения i внутренней части цикл.

Конечно, это также имеет немного ленивое преимущество того, чтобы быть тем меньше символа для ввода ;)

Я также спорил бы, что на языке с разумными правилами объема, поскольку я объявляюсь в конструкции цикла, это не должно быть доступно вне цикла. Это смягчило бы любую уверенность во мне являющийся равным N в конце цикла...

4
ответ дан 13 December 2019 в 22:19
поделиться

Я иногда предпочитаю это:

for (int i = 0; (i <= (n-1)); i++) { ... }

Эта версия показывает непосредственно диапазон значений, что я могу иметь. Мое взятие при проверке нижней и верхней границы диапазона - то, что при реальной необходимости в этом код имеет слишком много побочных эффектов и должен быть переписан.

Другая версия:

for (int i = 1; (i <= n); i++) { ... }

помогает Вам определить, как часто тело цикла называют. Это также имеет допустимые варианты использования.

0
ответ дан 13 December 2019 в 22:19
поделиться

Используя любое из вышеупомянутого в c# вызвал бы ошибку компилятора, если бы Вы использовали меня вне цикла

0
ответ дан 13 December 2019 в 22:19
поделиться

Я предпочитаю использовать № 2, только потому, что я пытаюсь не расширить значение меня за пределами для цикла. Если бы я отслеживал переменную как этот, то я создал бы дополнительный тест. Некоторые могут сказать, что это избыточно или неэффективно, но это напоминает читателю моего намерения: На данном этапе я должен равняться N

@timyates - Я соглашаюсь, что не нужно полагаться на побочные эффекты

0
ответ дан 13 December 2019 в 22:19
поделиться

Я думаю, что Вы заявили очень хорошо различие между двумя. У меня действительно есть следующие комментарии, хотя:

  • Это не "агностик языка", я вижу, что Ваши примеры находятся в C++, но существуют языки, где Нельзя изменить переменную цикла в цикле и других, которые не гарантируют, что значение индекса применимо после цикла (и некоторые делают обоих).

  • Вы объявили i индекс в for таким образом, я не держал бы пари на значении i после цикла. Примеры являются немного вводящими в заблуждение как они, implictly принимают это for определенный цикл. В действительности это - просто более удобный способ записать:

    // version 1
    { int i = 0;
      while (i != N) {
        ...
        ++i;
      }
    }
    

    Отметьте как i не определено после блока.

Если бы программист знал, что все вышеупомянутое не сделало бы общее предположение о значении i и было бы достаточно мудро для выбора i<N как конечные условия, чтобы гарантировать, что условие выхода будут в конечном счете соблюдать.

0
ответ дан 13 December 2019 в 22:19
поделиться

Я думаю, что большинство программистов использует 2-й, потому что он помогает выяснить то, что продолжается в цикле. Я могу посмотреть на него и "знать", что запущу как 0 и определенно буду меньше, чем N.

1-й вариант не имеет этого качества. Я могу посмотреть на него, и все, что я знаю, то, что я запущу как 0 и что это никогда не будет равно N. Не совсем как полезный.

Независимо от того, как Вы завершаете цикл, всегда хорошо очень опасаться использовать контрольную переменную цикла вне цикла. В Ваших примерах Вы (правильно) объявляете меня в цикле, таким образом, это не находится в объеме вне цикла, и вопрос его значения спорен...

Конечно, 2-й вариант также имеет преимущество, что это - то, что все ссылки C я видел использование :-)

1
ответ дан 13 December 2019 в 22:19
поделиться

При доверии коду можно сделать также.

Если Вы хотите, чтобы Ваш код был читаем и понятен (и таким образом более терпимым для изменения от кого-то, которого необходимо принять, чтобы быть недотепой), я использовал бы что-то как;

for ( int i = 0 ; i >= 0 && i < N ; ++i) 
1
ответ дан 13 December 2019 в 22:19
поделиться

Я всегда использую № 2 как затем, можно быть уверены, что цикл завершится... Доверие ему являющийся равным N впоследствии полагается на побочный эффект... Вы только лучше использовали бы переменную N саму?

[редактирование] Извините... Я имел в виду № 2

1
ответ дан 13 December 2019 в 22:19
поделиться

В C++, с помощью != тест предпочтен для общности. Итераторы в C++ имеют различные понятия, как входной итератор, передают итератор, двунаправленный итератор, итератор произвольного доступа, каждый из которых расширяет предыдущий с помощью новых возможностей. Для < для работы итератор произвольного доступа требуется, тогда как != просто требует входного итератора.

1
ответ дан 13 December 2019 в 22:19
поделиться

Мы не должны смотреть на счетчик в изоляции - если бы по какой-либо причине кто-то изменил способ, которым увеличен счетчик, то они изменили бы условия завершения и получающуюся логику, если это требуется поскольку я == N.

Я предпочел бы второе условие, так как это более стандартно и не приведет к бесконечному циклу.

2
ответ дан 13 December 2019 в 22:19
поделиться

В целом я предпочел бы

for ( int i = 0; i < N; ++i )

Наказание за ошибочную программу в производстве, кажется намного менее серьезным, Вам не засунут поток навсегда в для цикла, ситуация, которая может быть очень опасна и очень трудна диагностировать.

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

0
ответ дан 13 December 2019 в 22:19
поделиться

Для общей работы по программированию я предпочитаю

for ( int i = 0; i < N; ++i )

вместо

for ( int i = 0; i != N; ++i )

, потому что он менее подвержен ошибкам, особенно когда код подвергается рефакторингу. Я видел, как такой код случайно превратился в бесконечный цикл.

Я не верю, что этот аргумент «у вас возникнет искушение предположить, что i == N». Я никогда не делал этого предположения и не видел, чтобы другой программист делал это.

0
ответ дан 13 December 2019 в 22:19
поделиться
Другие вопросы по тегам:

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