Может ли оператор end заменить оператор endfor в Octave? - PullRequest
2 голосов
/ 11 апреля 2020

Эта ссылка показывает, что мы должны использовать оператор endfor, чтобы закрыть область действия for l oop.

Но замена его на end приводит к тому же поведению.

Имеет ли использование end вместо endfor неожиданные побочные эффекты?

Ответы [ 2 ]

3 голосов
/ 11 апреля 2020

end является синонимом endfor при закрытии for l oop.

Единственным побочным эффектом использования end является то, что ваш код также будет совместим с MATLAB, так как endfor является расширением языка, изобретенного Octave. Я рекомендую не использовать endfor и т.п. (endif, endfunction, endswitch, endwhile).

1 голос
/ 12 апреля 2020

На практике я в основном согласен с ответом Криса и в принципе следую тому же совету. Тем не менее, я чувствую необходимость сыграть здесь адвоката дьявола, потому что это звучит так, как будто решение разработчика октавы предоставить эти ключевые слова было ошибочным, когда на самом деле есть веская причина, и зная преимущества использования endfor, endif позволяет вам сделать обоснованное решение о том, когда и почему их следует избегать.

Позвольте мне продемонстрировать их полезность на примере:

function f(a)
    if a == 1
       disp('a == 1')
    else if a == 2
       disp('a == 2')
    else
       disp('a == 3')
    end
    disp('do some very important thing here that absolutely must be done always')
end

Можете ли вы обнаружить здесь тонкую, но смертельную ошибку?

Принимая во внимание, что если вы попытаетесь запустить этот код:

function f(a)
    if a == 1
       disp('a == 1')
    else if a == 2
       disp('a == 2')
    else
       disp('a == 3')
    endif
    disp('do important thing')
endfunction

октава немедленно предупредит вас, что что-то ужасно не так, и остановит вас от выстрела в ногу.

Есть во многих других ситуациях, когда endifs и endfors защитят вас, когда простой end не защитит. И, по крайней мере, они обеспечивают очень сильный визуальный указатель того, где вы находитесь в коде (я просто закрыл это для l oop, или я просто вышел из блока if). Особенно с учетом состояния большинства академических c кодов, которые обычно представляют собой набор неиспользуемых спагетти-кодов с множеством вложенных блоков if и for, которые проходят в милях в одном файле. Скорее всего, если вы будете следовать хорошим принципам разработки программного обеспечения, чистому, модульному, с надлежащим отступом кода, то дополнительный уровень защиты, добавляемый написанием endfor вместо end, вероятно, излишним. Но то, что это так, не означает, что их нет по уважительной причине.

Но, я согласен, если вы хотите совместимость с Matlab, и вы, вероятно, хотите, то лучше использовать «немного менее безопасную, но в конечном итоге совместимую» версию.

Как ни странно, я часто нахожу себя писать код, который выглядит следующим образом:

if something
  % large block of code here
end % if

просто для совместимости с Matlab, но все же визуально ясно, что только что закрытый блок на самом деле был блоком if.

...