流程控制
语句块
条件语句
if ... else 语句
switch 语句
注意
与其它语言不同,Collie 语言中,switch 代码块中 case 无需使用 break 跳出。
循环与迭代
循环语句
for
-
for 循环
for (初始化; 条件; 更新) {
// 执行代码块
if (you feel sad, we just skip current case, and move on to the next case) {
// maybe you want to do some thing before we continue...
continue;
}
} -
for-each 循环
for (item : ArrayOrList) { // 或 for (item in ArrayOrList)
// 执行代码块
}如果需要使用 index
for (item, index : ArrayOrList) {} -
for-map 循环
for (key, value : map) { // 或 for (key, value in map) {
// 执行代码块
}
for (entry : map) { // 或 for (entry in map) {
var key = entry.key;
var value = entry.value;
// 执行代码块
}如果需要使用 index
for (key, value, index : map) {}注意!没有这种写法:❌ 错误示范for (entry, index : map) {} // entry 和 index 实际为 key 和 value -
for-number 循环
for (number) { // 循环 number 次
// 执行代码块
}
// 如果需要
for (i : number) { // 循环 number 次,i 的值从 0 至 number-1
// 执行代码块
} -
for-range 循环
for (i : 1, 5) { // 循环 4 次,i 的值从 1 至 4
// 执行代码块
} -
for-iterator 循环:使用迭代器循环
for (item : iterator) {
// 执行代码块
} -
dead-for 循环
for! { // 或者 for (true) {
// 执行代码块
// 一直循环,直到 break 跳出,等价于 while(true)
if (some condition) {
break;
}
}危险另一个方案:使用
loop循环
while 与 do ... while
-
while 循环
while (条件) {
// 执行代码块
} -
do-while 循环
do {
// 执行代码块
} while (条件)
break
使用 break 语句来终止循环,或者链接到 label 语句。
break [label-identifier];
continue
continue 语句可以用来在循环中跳过代码块的剩余部分并进入下一次循环。
continue [label-identifier];
嵌套循环跳过 / 跳出指定循环
可通过 label 指定跳出 / 跳过的循环,参考嵌套循环跳出指定循环(本页) 和 嵌套循环跳过指定循环(本页)
跳过相邻多次循环【TODO】
TODO
似乎这个特性容易让人误解,需要考虑是否保留
提示
如果需要跳过相邻多次的循环,可以使用 continue(integer); 语句。传入 continue 的值必须是正整数(大于0的整数)。
例如:
[list] fruitList = [
"Apple", "Banana", "Orange", "Grape", "Strawberry",
"Watermelon", "Pineapple", "Mango", "Kiwi", "Blueberry",
"Peach", "Pear", "Cherry", "Lemon", "Coconut",
"Papaya", "Raspberry", "Blackberry", "Durian", "Pomegranate"
]
[list] resultList = []
for (fruit : fruitList) {
resultList.add(fruit)
continue(5);
}
// resultList: [ "Apple", "Watermelon", "Peach", "Papaya" ]
也可以在每次循环中,动态指定跳过的次数
[list] list = [ 1, 2, 4, 8, 16, 32, 64, 128, 356, 512, 1024, 2048 ]
for (item, index : list) {
log('item: {item}, index: {index}')
continue(index + 1);
}
// result:
// item: 1, index: 0
// TODO
迭代
label 语句
与 JavaScript, Java 等语言类似,Collie 语言支持通过 label 进行逻辑跳转。
查阅其它语言的 Label 语法
跳出嵌套代码块
function foo() {
logic1: {
// some code here
logic2: {
// some code here
if (condition) {
break logic1;
}
}
}
// after `break logic1`, we came here
}
嵌套循环跳出指定循环
如果需要连续跳出多次循环,可以使用 break label; 语句。
// 定义5个不同类别的水果列表
const colors = ['red', 'green', 'yellow'];
const fruits = ['apple', 'grape', 'banana'];
const sizes = ['small', 'medium', 'large'];
const origins = ['domestic', 'imported'];
const qualities = ['A', 'B', 'C'];
// 5层嵌套循环
for (const color of colors) {
fruits_loop: for (const fruit of fruits) {
for (const size of sizes) {
for (const origin of origins) {
for (const quality of qualities) {
log(`A ${color} ${size} ${fruit} from ${origin} origin, quality ${quality}`);
if (fruit == "grape") {
log("Oh! I hate $fruit$!")
// When fruit is "grape", we break out of the loop to `fruits_loop`
break fruits_loop;
}
}
}
}
}
// after `break fruits_loop`, we came here with fruit="grape"
}
嵌套循环跳出指定循环
与跳出类似,跳过使用 continue关键字:
outer_loop: for (x : 10) {
for (y : 10) {
if (x + y > 12) {
continue outer_loop;
}
}
}