^table.menu{}, разделитель и ^continue[] |
Мне видится нелогичным, что разделитель выводится (или вычисляется, если он в фигурных скобках) при использовании оператора continue. "Грубый" пример:
^table.menu{
^if(1 == 1){
^continue[]
}
$table.field
}[,] Выводятся лишь запятые, а хотелось бы "пусто". Разделитель неудобно переносить в тело menu. Найдутся согласные со мной? Стоит ждать доработки языка? |
Как я понял, тут проблема в непустом теле menu. Т.е. если форматировать код иначе, то разделители не выведутся:
^table.menu{^if(1 == 1){^continue[]}
$table.field
}[,]
Не очень красиво, хотелось бы, чтобы continue "обнулял" тело, но пока жить можно:-) |
в чем смысл конструкции? |
| опишите задачу для решения которой вы используете данный код, есть подозрение, что вы делаете что-то не так. |
| Эм. Про смысл continue в доке написано. Да и я описал дословно, разве что пример "не живой". Что именно делаю не так? |
Для чего надо принудительно продолжать цикл? |
Обычный отбор по условию. locate в новую таблицу не всегда подходит. Это касается не только таблиц, а любых циклов. |
хм... |
давайте все-таки посмотрим на задачу?
например, лично мне никогда такое не требовалось.
разделитель в описанном вами примере работает логично - после каждой итерации печатаем разделитель.
непонятна ваша логика и задача |
Моё мнение, что continue -- пропущенная итерация => пустое тело => разделитель не выводится. Только вот пустое тело приходится формировать в коде руками. Задача здесь не причём. |
А разве разделитель БЕЗ ^continue[] при пустой итерации выводится? |
И для чего указывать разделитель на каждой итерации, если внутри итерации хотите пустое тело? |
мне кажется, вы не правы |
^continue[] = это продолжение выполнения цикла, это очевидно.
В вашем случае, логично самому выводить свой разделитель именно так, как вам нужно, если такая задача у вас есть. Возможно, есть какое-то более изящное решение, но мы не знаем вашей задачи. Возможно, вычисляемый разделитель будет удобнее.
Вы думаете, что раз в вашем цикле вы полняете только пару команд(if/continue), то итерация типа "не настоящяя". однако, это далеко не так. Раз выполнение кода в блоке началось, значит итерация состоялась.
В других языках continue означает тоже самое, то что там нет разделителя, ситуации не меняет.
Даже наличие break не отменяет факта итерации. |
continue может быть в середине тела. Собственно, он для того и придуман, что бы всё тело не оборачивать в большие if'ы (если несколько условий) или в несколько вложенных if'оф. В любой момент можно прервать итерацию. А разделитель сам по себе удобен тем, что не нужно делать проверок на первую/последнюю строку (случай с таблицей) в теле. Вот такой вот простой наглядности хочется. Увы, с парсерной идеологией "код внутри текста (тела вывода)" это не вяжется. |
| Прочитайте внимательно в доке, в каких случаях отрабатывает разделитель. Не только сам факт начала итерации влияет на его вывод. |
^while(...){
if(..){
$sDelimiter[,]
}{
$sDelimiter[]
}
}
}{$sDelimiter}
чем это плохо? |
Ну да, формально там написано "выполняется перед каждым непустым не первым телом", а реально при второй и предпоследней итерации.
Это уже пусть разработчики языка внесут ясность в нашу дискуссию. |
Давно уже идёт просто флейм, пора завязывать. |
Не формально, а как раз реально. Я привёл рабочий пример своего же кода в самом начале.
Ваш пример (ниже по треду) не оптимален. Вычислимая запятая -- слишком дорого, хоть и спички:-) Тогда уж проще всего:
^while(...){^if(..){
code
}[$sDelimiter] Ну, это при условии, что проверку можно сделать в самом начале.
P.S. Меня интересовал лишь один технический момент, возможно, Misha или Moko потом ответят. |
все правильно |
$i(0)
^while($i<10){^i.inc[]^if(1==1){^continue[] ololo }}[,]
Т.е. если тело содержит что-то, включая пробелы - то разделитель пропускается, иначе - ставиться. |
точнее, наоборот, но суть понятна ) |
я не понял, на что нужно ответить :) |
всё работает как и задумано. если вы формируете списки, то по моему очевидно, что вы сами должны позаботиться о том, чтобы туда не попадали пробельные символы, если они вам мешают.
ситуация, когда добавляется разделитель, один из тх случаев, когда пробельные символы мешают.
в любом случае, если есть какое-либо предложение по изменению функционала, чтобы упростить подобные ситуации и не ломать текущую обратную совместимость -- в студию их :) |
Часто приходится формировать списки для запроса в БД. В таких случаях мне важнее читаемость кода, в ущерб объёма передаваемых данных (лишних пробельных символов). Единственное, что могу предложить -- необязательный параметр операторам break и continue, с которым они не будут выводить тело текущей (прерванной) итерации и, соответственно, разделитель. |
workaround |
explicit result declaration -- в данном случае ваш друг, который сам удалит все пробельные символы, использующиеся для форматирования кода, из кода метода и они не будут мешать формированию separator-а.
@main[]
^z[^table::create{field
1
2
3
4
5}]
@z[table][result]
^table.menu{
^if(^table.line[]>2){
^continue[]
}
$table.field
}[,]
P.S. даже явно написанная запятая в данном случае не мешается :) |
красиво, запомню, но... |
но, во-первых, это отдельный метод, что не всегда удобно для нефункционального куска кода и, во-вторых: в моём представлении разрыв шаблона, когда объявлен result, но его как такового в методе не значится:-) Проще отформатировать код. |