Другой способ сделать это — использовать блоки else
в циклах for
:
shared void run() {
variable Integer? x = null;
for (i in 0:3) {
for (j in 0:3) {
for (k in 0:3) {
value n = i*j*k;
if (n > 18) {
x = n;
break;
} else {
continue;
}
} else {
continue;
}
break;
} else {
continue;
}
break;
} else {
x = null;
}
print(x);
}
В общем место
else {
continue;
}
break;
после каждой закрывающей скобки for
.
(Примечание. В идеале присваиваемая переменная — x
в моем примере, something
в вашем — не обязательно должна быть variable
, поскольку она назначается ровно один раз. Однако в настоящее время проверка типов не может этого доказать.)
Как это работает? else
после цикла for
выполняется, если этот цикл завершился без каких-либо break
. В этом случае мы также хотим continue
выполнить внешний цикл; в противном случае — то есть, если мы вышли из внутреннего цикла — мы хотим break
также и из внешнего.
Это можно было бы написать более кратко, используя следующий синтаксис, предложенный в ceylon/ceylon#3223:
for (a in b) {
for (x in y) {
if (something) {
break;
}
} then { // opposite of else: runs iff there was a break in the inner loop
break;
}
}
Я бы не рекомендовал это решение по трем причинам:
- Это еще менее читабельно, чем ваше решение для закрытия. Функция
for {} else {}
довольно неясна, и ее значение совершенно неочевидно, если вы с ней не знакомы, что делает код непонятным для случайного читателя.
- Он сильно раздувает код в каждом окружающем цикле (не только один раз), что также делает его нечитаемым.
- Если вы хотите иметь код во внешних циклах после внутренних циклов, вам придется продублировать его: блок
else
и код после него нуждаются в копии.
person
Lucas Werkmeister
schedule
23.01.2016