资讯动态

仓颉语言区间类型 `Range<T>` 完全指南:固定步长序列的创建、字面量语法与遍历实践

发布时间:2026/10/14 2:51:24 来源:尧图企业网站定制
文档编程语言【免费下载链接】cangjie_docs仓颉编程语言开发者文档。项目地址https://gitcode.com/Cangjie/cangjie_docs点击查看免费下载导读本文围绕仓颉编程语言Cangjie开发者文档中的区间类型章节展开系统讲解RangeT泛型区间类型的设计原理、start/end/step三要素、区间构造器实例化方式以及start..end : step与start..end : step两类区间字面量的完整语法规则与空区间判定条件。阅读完本文你将能够熟练创建整数区间、倒序区间与空区间理解区间操作符..、..的优先级与词法地位并掌握通过for-in表达式遍历区间、结合宏与模式匹配使用区间的实战方法。一、什么是区间类型区间类型Range Type用于表示拥有固定步长的序列。在仓颉语言中区间类型是一个泛型使用RangeT表示。当T被实例化为不同类型时仓颉会得到不同的区间类型。其中对T本身有两个硬性要求类型必须支持关系操作符如、、、因为区间需要比较start与end的大小关系来判定序列是否为空、是否继续步进该类型必须可以和Int64类型的值做加法因为step的类型固定为Int64每向前推进一个元素都需要执行当前值 step的运算。最常用的实例化类型是RangeInt64用于表示整数区间例如0..10即0, 1, ..., 9。由于浮点类型同样支持关系操作符并能与Int64相加理论上也可以实例化出浮点区间但整数区间是日常开发中使用频率最高的形式。二、区间实例的三要素start、end与step每一个区间类型的实例都包含三个值字段含义类型start序列的起始值T与实例化类型相同end序列的终止值T与实例化类型相同step序列中前后两个元素之间的差值步长Int64且不能等于0start与end的类型相同即T被实例化的类型而step恒为Int64。这里特别强调step的值不能等于0否则步进过程将永远无法到达终止条件序列无法收敛因此编译器会直接拒绝该取值。关于区间类型的具体定义和其中属性的完整说明详见《仓颉编程语言库 API》。三、通过构造器实例化区间除了使用字面量见下文区间类型也可以通过显式构造器创建。其构造签名如下// RangeT(start: T, end: T, step: Int64, hasStart: Bool, hasEnd: Bool, isClosed: Bool)构造器共接收六个参数start、end区间的起始值与终止值step步长Int64类型hasStart是否包含起始值hasEnd是否包含终止值isClosed区间是否为闭区间决定end处的元素是否包含在序列中。下面是一组完整可编译的实例化示例let r1 RangeInt64(0, 10, 1, true, true, true) // r1 包含 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 let r2 RangeInt64(0, 10, 1, true, true, false) // r2 包含 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 let r3 RangeInt64(10, 0, -2, true, true, false) // r3 包含 10, 8, 6, 4, 2对比r1与r2可以看出isClosed为true时end即 10会包含在序列中为false时序列在到达end之前结束。r3则演示了负步长倒序区间从10出发每次减去2得到10, 8, 6, 4, 2。四、区间字面量两种形式区间字面量有且仅有两种形式分别对应两种开闭语义1. 左闭右开区间start..end : step格式为start..end : step表示从start开始、以step为步长、到end为止但不包含end的区间。2. 左闭右闭区间start..end : step格式为start..end : step表示从start开始、以step为步长、到end为止且包含end的区间。以下示例定义了若干区间类型变量//后的注释标注了区间实际包含的元素let n 10 let r1 0..10 : 1 // r1 包含 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 let r2 0..n : 1 // r2 包含 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 let r3 n..0 : -2 // r3 包含 10, 8, 6, 4, 2 let r4 10..0 : -2 // r4 包含 10, 8, 6, 4, 2, 0注意两个细节start、end不仅可以是字面量也可以是变量或任意表达式如示例中的n右闭区间在倒序时也会把终点包含进来r4中包含了0这是它与左闭右开区间r3的差异所在。五、step缺省规则与空区间step可以省略默认值为1在区间字面量中step及其前的冒号可以整体省略此时step默认等于1。但无论显式还是缺省step的值都不能等于0let r5 0..10 // r5 的 step 为 1包含 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 let r6 0..10 : 0 // 错误step 不能为 0空区间区间也可能是空的即不包含任何元素的空序列。只要start、end与step的组合方向不一致就会产生空区间let r7 10..0 : 1 // r7 至 r10 均为空区间 let r8 0..10 : -1 let r9 10..0 : 1 let r10 0..10 : -1具体空区间判定条件如下注意表达式start..end : step中当step 0且start end或者step 0且start end时start..end : step是一个空区间表达式start..end : step中当step 0且start end或者step 0且start end时start..end : step是一个空区间。归纳起来正步长要求起点严格位于终点之前右开还需start end判空负步长要求起点严格位于终点之后方向不匹配则序列为空。六、区间操作符的底层地位优先级与词法记号区间字面量背后的区间操作符是..左闭右开与..左闭右闭两个二元中缀操作符。在基本操作符文档中明确说明这两个操作符分别用于创建“左闭右开”和“左闭右闭”的区间实例。从操作符附录的完整优先级表可以看出..与..的优先级为 8数值越小优先级越高高于关系操作符、、、优先级 9和判等操作符、!优先级 10但低于算术操作符优先级 46。这一优先级设计产生了一个重要影响在表达式文档中let pattern - expression结构要求expression的优先级不能低于..运算符——例如if (let m - 0..generateSomeInt())是合法写法而优先级低于..的操作符如as出现在区间表达式中会导致解析错误此时需要用()改变优先级。从词法层面看区间操作符是仓颉编译器的内置记号。在TokenKind 类型中可以看到| RANGEOP // .. | CLOSEDRANGEOP // .. | ELLIPSIS // ...即..与..分别对应RANGEOP与CLOSEDRANGEOP两种 TokenKind由词法分析器直接识别属于语言核心语法的一部分而非库函数实现的语法糖。七、实战区间与for-in遍历区间类型在仓颉中最常见的实战场景是与for-in表达式配合完成循环遍历。仓颉内置的区间和数组等类型已经扩展了IterableT接口因此区间实例可以直接作为for-in的遍历序列。以经典的 1 到 100 求和为例出自表达式文档的“遍历区间”小节main() { var sum 0 for (i in 1..100) { sum i } println(sum) }运行以上程序将输出5050这里1..100是包含100的左闭右闭区间遍历恰好覆盖 1 至 100 的全部整数。若改用1..100则 100 不会被包含结果将是 4950——这正是“左闭右开”与“左闭右闭”在实战中需要格外留意的差异。for-in的遍历规则为先计算序列表达式、初始化迭代器随后每轮更新迭代器并绑定迭代变量执行循环体直至迭代器终止。八、更多场景宏与模式匹配中的区间区间语法还渗透到仓颉的宏与模式匹配等高级特性中宏DSL场景在宏实战案例中自定义 LINQ 风格宏linq的示例就使用了区间字面量作为数据源linq(from x in 1..10 where x % 2 1 select x * x)该表达式从1, 2, ..., 10中筛选出奇数并返回其平方输出1, 9, 25, 49, 81。可以看到区间字面量在 DSL 语法中同样可以直接使用且宏解析器正是通过识别RANGEOP、CLOSEDRANGEOP等 TokenKind 来还原这类语法结构的。语法节点场景在宏语法节点文档中for (i in 1..5)这类写法也直接出现在宏处理后的语法树示例中说明区间字面量在语法树层面以标准节点形式存在可被宏代码读取与改写。模式匹配场景如表达式文档所述区间表达式还可以出现在let pattern - expression结构中此时表达式部分的运算符优先级不能低于..必要时用括号显式分组。九、小结与使用建议回到本文核心使用仓颉区间类型时请牢记以下要点三要素区间实例由start、end、step构成step为Int64且不可为0两种字面量start..end : step左闭右开不含endstart..end : step左闭右闭含end缺省步长step可省略默认1空区间正步长但起点不小于终点、负步长但起点不大于终点时区间为空属合法但无元素的序列通用性RangeT是泛型只要T支持关系操作符且能与Int64相加即可实例化RangeInt64是最常用的整数区间实战组合区间天然实现IterableT可直接用于for-in循环也可出现在宏 DSL、模式匹配等语法场景中。只要把握住“左闭右开/左闭右闭”这一语义分水岭以及正负步长与起止位置的匹配关系你就能准确构建出所需的任意整数序列避免空区间或越界元素带来的隐蔽问题。赞分享文档编程语言【免费下载链接】cangjie_docs仓颉编程语言开发者文档。项目地址https://gitcode.com/Cangjie/cangjie_docs点击查看免费下载相关推荐仓颉编程语言 Rune 字符类型完全指南字面量、转义、Unicode 表示与类型转换仓颉编程语言 Rune 字符类型完全指南字面量、转义、Unicode 表示与类型转换 本篇技术指南系统讲解仓颉编程语言Cangjie内置字符类型 Rune文档知识库教程OpenHarmony仓颉编程语言整数类型完全指南字面量、表示范围与类型转换仓颉编程语言整数类型完全指南字面量、表示范围与类型转换 整数类型是仓颉Cangjie编程语言中最基础、使用频率最高的数据类型之一。本文以官方开发者文档 d文档编程语言Exercises 仓库实战仓颉语言解 LeetCode「两数之和」——HashMap 一次遍历算法与仓颉语法要点Exercises 仓库实战仓颉语言解 LeetCode「两数之和」——HashMap 一次遍历算法与仓颉语法要点 本文基于 Exercises 仓库中 【L示例工程教育上一篇终极NDS游戏文件编辑器Tinke从入门到精通完整指南下一篇Audio Slicer3分钟掌握智能音频分割的终极免费方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑