一键导入
cangjie-for
仓颉语言 for-in 迭代。当需要了解 for-in 循环语法、Iterable/Iterator 接口、Range 区间类型、迭代控制(break/continue/where)、元组解构、自定义迭代器、迭代最优实践等特性时,应使用此 Skill。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
仓颉语言 for-in 迭代。当需要了解 for-in 循环语法、Iterable/Iterator 接口、Range 区间类型、迭代控制(break/continue/where)、元组解构、自定义迭代器、迭代最优实践等特性时,应使用此 Skill。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
通用算法与数据结构实现参考——排序、搜索、动态规划、图算法、字符串处理的多语言惯用写法和模板代码(Python/C++/Java/Go/Cangjie)
仓颉语言算法与数据结构实现参考——排序、搜索、动态规划、图算法、字符串处理、集合操作的惯用写法和模板代码
仓颉编程语言基本概念和规则,当需要了解关键字、标识符、程序结构、变量定义(let/var/const)、值类型与引用类型、作用域规则、表达式(if/while/for-in/break/continue)、函数等基本概念时,应使用此 Skill
仓颉语言基本数据类型。当需要了解仓颉语言的整数、浮点、布尔、字符(Rune)、字符串(String)、Unit、Nothing、元组(Tuple)、数组(Array/VArray)、区间(Range)类型以及基本运算符的语法和规则时,应使用此 Skill。
仓颉程序与C程序互操作指导,包括foreign声明、CFunc、inout参数、unsafe块、调用约定、类型映射(基础类型/结构体/CPointer/VArray/CString)、C回调仓颉、内存管理等特性时,应使用此 Skill
仓颉语言类。当需要了解仓颉语言的类定义、抽象类、构造函数(init/主构造函数)、终结器(~init)、继承(单继承/sealed)、重写(override)、重定义(redef)、成员变量、成员函数、属性(prop)、访问修饰符、This类型、对象创建等特性时,应使用此 Skill。
| name | cangjie-for |
| description | 仓颉语言 for-in 迭代。当需要了解 for-in 循环语法、Iterable/Iterator 接口、Range 区间类型、迭代控制(break/continue/where)、元组解构、自定义迭代器、迭代最优实践等特性时,应使用此 Skill。 |
for (item in sequence) {
exprs
}
sequence 须实现 Iterable<T> 接口sequence 表达式仅在首次迭代前求值一次Unit,值为 ()sequence,调用 iterator() 获取迭代器next():返回 None 则退出循环,返回 Some(value) 则继续value 绑定到 item,执行循环体item 不可变(let 绑定),不能在循环体中重新赋值_ 占位避免警告:
for (_ in 0..3) {
println("hello")
}
start..end — 不包含 endstart..=end — 包含 end: step,省略时默认为 1;step 不能为 0for (i in 0..5) { print(i) } // 输出:01234
for (i in 0..=5) { print(i) } // 输出:012345
for (i in 0..10 : 2) { print(i) } // 输出:02468
for (i in 5..0 : -1) { print(i) } // 输出:54321
for (i in 10..0 : -3) { print(i) } // 输出:10741
step > 0 && start >= end(半开)或 step > 0 && start > end(闭)→ 空区间,循环体不执行step < 0 && start <= end(半开)或 step < 0 && start < end(闭)→ 空区间public struct Range<T> <: Iterable<T> where T <: Countable<T> & Comparable<T> & Equatable<T>
start: T、end: T、step: Int64isEmpty() 判断是否为空;iterator() 返回迭代器interface Iterable<T> {
func iterator(): Iterator<T>
}
interface Iterator<T> <: Iterable<T> {
mut func next(): Option<T>
}
Iterator 自身扩展 Iterable,可直接用于 for-innext() 返回 Some(value) 表示有元素,None 表示迭代结束for (i in list) { println(i) }
等价于:
var it = list.iterator()
while (let Some(i) <- it.next()) {
println(i)
}
| 类型 | 元素类型 | 有序 |
|---|---|---|
Range<T> | T | ✅ |
Array<T> | T | ✅ |
ArrayList<T> | T | ✅ |
String | Rune | ✅ |
HashMap<K, V> | (K, V) | ❌ |
HashSet<T> | T | ❌ |
let points = [(1, 2), (3, 4), (5, 6)]
for ((x, y) in points) {
println("x=${x}, y=${y}")
}
import std.collection.*
main() {
let map = HashMap<String, Int64>([("a", 1), ("b", 2)])
for ((key, value) in map) {
println("${key}: ${value}")
}
}
where 在循环体执行前过滤,比循环体内 if 更简洁:// ✅ 推荐:where 过滤
for (i in 0..20 where i % 3 == 0) {
println(i) // 0, 3, 6, 9, 12, 15, 18
}
// ❌ 不推荐:循环体内 if 判断
for (i in 0..20) {
if (i % 3 == 0) {
println(i)
}
}
break 提前退出循环,continue 跳到下一次迭代Nothingfor (i in 0..100) {
if (i > 5) { break }
if (i % 2 == 0) { continue }
println(i) // 1, 3, 5
}
注意 String 只实现了 Iterable<Byte>,逐字节而不是逐字符迭代:
for (ch in "Hi仓颉") {
println(ch) // 逐个输出:72 105 228 187 147 233 162 137
}
如果需要逐字符(Rune)迭代,可以先调用 toRuneArray() 转为字符数组后再使用:
for (ch in "Hi仓颉".toRuneArray()) {
println(ch) // 逐个输出:H i 仓 颉
}
实现 Iterable<T> 接口即可获得 for-in 支持:
class Countdown <: Iterable<Int64> {
let start: Int64
init(start: Int64) { this.start = start }
public func iterator(): Iterator<Int64> {
CountdownIterator(start)
}
}
class CountdownIterator <: Iterator<Int64> {
var current: Int64
init(start: Int64) { current = start }
public func next(): Option<Int64> {
if (current > 0) {
let v = current
current--
return Some(v)
}
return None
}
}
main() {
for (i in Countdown(5)) {
print("${i} ") // 输出:5 4 3 2 1
}
}
while + iterator() 更安全、简洁,且编译器可优化enumerate()(若集合支持),否则使用 Range:
let arr = [10, 20, 30]
for (i in 0..arr.size) {
println("arr[${i}] = ${arr[i]}")
}
// ✅ 推荐
for (_ in 0..n) { doSomething() }
// ❌ 不推荐
var i = 0
while (i < n) { doSomething(); i++ }
where 子句,减少嵌套、提升可读性(见 4.2)HashMap 和 HashSet 迭代顺序不确定,不应依赖遍历顺序// ❌ 错误:试图修改迭代变量
for (i in 0..5) {
// i = i + 1 // 编译错误,迭代变量不可变
}
// ❌ 错误:step 为 0
// for (i in 0..10 : 0) { } // 运行时错误
// ❌ 错误:半开区间边界混淆
for (i in 0..5) { print(i) } // 01234,不包含 5
for (i in 0..=5) { print(i) } // 012345,包含 5