另一種方法是使用在for
循環else
塊:
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
,因爲它正好分配有一次不過,目前can’t prove that的typechecker。)
如何它工作嗎?如果該循環運行到完成而沒有任何break
,則在執行for
循環後執行else
。在這種情況下,我們也想要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
塊和它後面的代碼都需要一個副本。