|
Как покинуть IF без GOTO
|
|||
---|---|---|---|
#18+
Хотелось бы остановить выполнение кода внутри if при выполнении какого-то из условий (чтобы дальше не тратить калории). Думал, что должно сработать как-то так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Но получилось только так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Другого варианта выскочить из if нет? Ну кроме GOTO, понятно. Всем кстати, понравилось, что в 2012 каше метки должны быть уникальны не только внутри метода, но и внутри всего класса? Мы немного взбодрились в свое время... Впрочем, версия не использовать метки и GOTO в этом свете актуальна - мало ли что дальше они придумают. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2012, 09:40 |
|
Как покинуть IF без GOTO
|
|||
---|---|---|---|
#18+
мы еще используем Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2012, 10:12 |
|
Как покинуть IF без GOTO
|
|||
---|---|---|---|
#18+
kolesovДругого варианта выскочить из if нет? Ну кроме GOTO, понятно. Свежак! http://docs.intersystems.com/cache20102/csp/docbook/DocBook.UI.Page.cls?KEY=RCOS_ccontinue А с GOTO нужно четко помнить "откуда" и "куда" идет переход. А некоторые так "напереходят", что попадают в "стековый" цикл... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2012, 10:55 |
|
Как покинуть IF без GOTO
|
|||
---|---|---|---|
#18+
kolesov , а чем QUIT-то провинился? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2012, 10:56 |
|
Как покинуть IF без GOTO
|
|||
---|---|---|---|
#18+
kolesov, имхо, вариант c for приемлимое решение, существенно сокращает размер кода, использую такое в js ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2012, 11:17 |
|
Как покинуть IF без GOTO
|
|||
---|---|---|---|
#18+
DAiMorмы еще используем Код: sql 1. 2. 3. 4. 5.
в данном случае смотрится лучше, чем for {...} (по моему). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2012, 14:52 |
|
Как покинуть IF без GOTO
|
|||
---|---|---|---|
#18+
kolesovВсем кстати, понравилось, что в 2012 каше метки должны быть уникальны не только внутри метода, но и внутри всего класса? Мы немного взбодрились в свое время...Можно ссылку на документацию или пример кода? В 2012.2 следующий код компилируется и работает без ошибок:Class test.kolesov Extends %RegisteredObject { ClassMethod Test1() As %Status { goto a w 1,! a w 2,! q $$$OK } ClassMethod Test2() As %Status { goto a w 3,! a w 4,! q $$$OK } } PS: Identical Labels In Multiple Methods Of The Same Class ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2012, 15:21 |
|
Как покинуть IF без GOTO
|
|||
---|---|---|---|
#18+
servit, видимо, ошибка компиляции в классах, помеченных PROCEDUREBLOCK = 0. - - - - - If two or more methods of that class define a label of the same name, and the methods are marked as PROCEDUREBLOCK = 0, there was the risk that the compiler would include them in the same compiled unit and report a duplicate label error. - - - - - у меня проблемы были именно в этом случае. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2012, 16:42 |
|
Как покинуть IF без GOTO
|
|||
---|---|---|---|
#18+
Да, знакомая ситуация. Совсем недавно столкнулся с такой же проблемой. Тоже решил с помощью фиктивного бесконечного while (можно и for), тело которого выполняется на самом деле только один раз. Другие решения (GOTO или вложенные для каждой проверки if-else) нравятся гораздо меньше. Кстати, такая ситуация не только внутри if может возникнуть, но и без оного. Если просто есть большой участок кода, в котором последовательно проверяется выполнение каких-то условий. Если очередное условие не выполнено, оставшийся кусок участка нужно обойти, и продолжать выполнение с первой строчки после этого участка. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.09.2012, 18:47 |
|
Как покинуть IF без GOTO
|
|||
---|---|---|---|
#18+
EvLaUy... Тоже решил с помощью фиктивного бесконечного while (можно и for), тело которого выполняется на самом деле только один раз. ... Как раз команда DO { ... ... quit ... } WHILE 0 и не является фиктивным бесконечным циклом, а явно показывает, что выполняется ОДИН раз тело DO {...} (можно было WHILE 0 и убрать из синтаксиса для красоты :) ). Нет недопонимания или ошибочного зацикливания, если quit неверный в FOR указали. Впрочем, FOR f=1 {...} тоже один раз исполнится... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2012, 04:54 |
|
Как покинуть IF без GOTO
|
|||
---|---|---|---|
#18+
Я бы склонился вот к такому варианту... Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Т.е. простая процедура все и разрулит лучшим образом... ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2012, 09:05 |
|
Как покинуть IF без GOTO
|
|||
---|---|---|---|
#18+
Ну или так... Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2012, 09:08 |
|
Как покинуть IF без GOTO
|
|||
---|---|---|---|
#18+
kolesov , TRY / CATCH and QUIT and GOTO Вариант с try/catch n SQLCODE,cry s (SQLCODE,cry)=0 if SQLCODE=0 { try{ // Проверяем условие 1 s SQLCODE=0 w "SQLCODE 1=",SQLCODE,! q:SQLCODE // Дальше проверять ничего не нужно - уже и так все понятно // Проверяем условие 2 s SQLCODE=0 w "SQLCODE 2=",SQLCODE,! q:SQLCODE // Проверяем условие 3 s SQLCODE=-100 w "SQLCODE 3=",SQLCODE,! q:SQLCODE // Проверяем условие Эн s SQLCODE=0 w "SQLCODE Эн=",SQLCODE,! q:SQLCODE // Ни одно из условий не выполнено, расстраиваемся s cry = 1 }catch{} } // Продолжаем расчет w cry,!,"ok" ... |
|||
:
Нравится:
Не нравится:
|
|||
25.09.2012, 11:53 |
|
|
start [/forum/topic.php?fid=39&fpage=33&tid=1557369]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
2ms |
others: | 420ms |
total: | 562ms |
0 / 0 |