NOTE阅读文档版本:
语言规约 Cangjie-0.53.18-Spec
具体开发指南 Cangjie-LTS-1.0.4
在阅读 了解仓颉的语言规约时, 难免会涉及到一些仓颉的示例代码, 但 我们对仓颉并不熟悉, 所以可以用 仓颉在线体验 快速验证
有条件当然可以直接 配置 Canjie-SDK
WARNING博主在此之前, 基本只接触过 C/C++语言, 对大多现代语言都没有了解, 所以在阅读过程中遇到相似的概念, 难免会与 C/C++中的相似概念作类比, 见谅
且, 本系列是文档阅读, 而不是仓颉的零基础教学, 所以如果要跟着阅读的话最好有一门编程语言的开发经验
WARNING在阅读仓颉编程语言的开发指南之前, 已经大概阅读了一遍 仓颉编程语言的语言规约, 已经对仓颉编程语言有了一个大概的了解
所以在阅读开发指南时, 不会对类似: 类、函数、结构体、接口等解释起来较为复杂名称 做出解释
此样式内容, 表示文档原文内容
Collection类型
Iterable和Collections
前面已经了解过
Range、Array、ArrayList, 它们都可以使用for-in进行遍历操作对于开发者自定义的类型, 也能实现类似的遍历操作
Range、Array、ArrayList都是通过Iterable来支持for-in语法的
Iterable是如下形式(只展示了核心代码)的一个内置interfaceinterface Iterable<T> {func iterator(): Iterator<T>...}
iterator函数要求返回的Iterator类型是如下形式(只展示了核心代码)的另一个内置interfaceinterface Iterator<T> <: Iterable<T> {mut func next(): Option<T>...}可以使用
for-in语法来遍历任何一个实现了Iterable接口类型的实例假设有这样一段
for-in代码, 如下所示let list = [1, 2, 3]for (i in list) {println(i)}它等价于如下形式的
while代码let list = [1, 2, 3]var it = list.iterator()while (true) {match (it.next()) {case Some(i) => println(i)case None => break}}另外一种常见的遍历
Iterable类型的方法是在while表达式的条件中使用模式匹配, 比如上面while代码的另一种等价写法是:let list = [1, 2, 3]var it = list.iterator()while (let Some(i) <- it.next()) {println(i)}
Array、ArrayList、HashSet、HashMap类型都实现了Iterable, 因此可以将其用在for-in或者while中
Iterable接口, 是Collection类型能够使用for-in遍历其元素的原因
Iterable这个名字意为可迭代的, 不由让人联想到C++容器中的迭代器
仓颉Iterable实际可以类比C++容器中的迭代器
Iterable接口拥有iterator()函数, 此函数返回一个Iterator<T>类型
Iterator<T>类型拥有next()函数, 返回Option<T>类型数据
这就是Collection可被for-in等循环遍历访问元素的关键
这意味着, 只要实现了Iterable的类型, 其实都可以使用for-in等语法循环迭代遍历