仓颉语言 1.0.0 升级指南:工具链适配、collection 操作重构与 Map 遍历删除避坑
本文为原创文章,版权归作者所有。转载请注明出处,作者:行十万里人生,未经允许不得转载。
1. Cangjie 1.0.0 工具链适配
版本号 1.0.0 为 Cangjie 语言首个长期支持版本(LTS)。根据 文档-仓颉编程语言官网 中的指导,即可成功安装仓颉工具链 :下载并解压安装包 -> 执行安装脚本 -> 配置环境变量。
如果使用 VS Code 进行 Cangjie 开发,则还需下载并安装适用于 VS Code 的插件(下载中心-仓颉编程语言官网)。
进行完以上流程后,可在 power shell 中执行 cjc -v
命令,检验版本号 1.0.0 工具链安装是否成功。
2. 非标准库组件迁移(版本 0.53.18 -> 1.0.0)
版本号 0.53.18 中存在多个非标准包,如:encoding、net、serialization、log …
随着版本升级,部分内容被纳入版本号 1.0.0 的标准库(std)中,其余部分则被整合进 stdx 包进行统一管理。
要在版本 1.0.0 中使用这些非标准包组件,需要执行以下步骤:
- 首先下载 stdx 包,并将其解压缩至本地存储位置。
- 接着在项目文件 cjpm.toml 中添加如下配置,以保证正确引用 stdx 包:
[target.x86_64-w64-mingw32] # 系统架构和 OS 信息[target.x86_64-w64-mingw32.bin-dependencies]# 根据 stdx 实际路径进行配置path-option = ["C:\\cangjie-stdx-windows-x64-1.0.0.1\\windows_x86_64_llvm\\dynamic\\stdx"]
下载路径:cangjie-stdx
3. collection 操作统一与新增类型
旧版本 0.53.18 中,不同 collection 类型提供了各自独立的操作接口。例如,ArrayList<T> 支持 append 和 appendAll 方法,而 HashMap 和 HashSet 则使用 put 方法进行元素插入。
新版本统一了各 collection 的 API 命名规范。如使用 add(或 addXxx)方法来进行元素的插入操作,使用 remove 方法进行元素移除的操作;且通过函数重载机制, 这些方法能够支持单元素、批量元素或其他操作。
以 ArrayList<T> 和 HashMap<K, V> 为例,具体详见 类 - 仓颉编程语言 :
- class ArrayList<T> :
- class HashMap<K, V> :
除了统一 collection 类型的 API 命名规范之外,版本 1.0.0 拓展了多种常见的容器类型,进一步丰富了内置库的数据结构能力,包括:
- 线性结构:
ArrayDeque<T>
(双端队列)、ArrayQueue<T>
(循环队列) 、ArrayStack
(栈) - 有序结构:
TreeMap<K, V>
(基于 BST 实现的有序映射)、TreeSet<T>
(基于 TreeMap 实现的有序集合) - 链表结构:
LinkedList<T>
(双向链表)
4. Map / Set 遍历删除避坑
在 Cangjie 中,Map / Set 类容器(HashMap / HashSet / TreeMap / TreeSet)均不支持 “遍历并删除” 的行为。这对于需要在遍历过程中,筛选(不)满足条件的 key 值并进行删除的场景带来了极大不便。
好在 Cangjie 中各类容器的 remove 操作支持批量删除元素,因此可以在遍历过程中使用 ArrayList 收集所有(不)满足条件的 key 值,在遍历结束后调用 remove(all : deleted)
方法进行批量删除,从而解决此问题。
// 伪代码:let deleted = ArrayList<T>()for ((key, value) in map) {// 收集所有(不)满足条件的 key 值if (xxx) {deleted.add(key)}
}map.remove(all : deleted)
正常情况下 “直接删除数据” 与 “批量删除数据” 的性能差异并不大,以 HashMap 为例:
Ubuntu 20.04 平台下进行测试。