仓颉语言 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 包:
toml 复制代码
[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) 方法进行批量删除,从而解决此问题。

Cangjie 复制代码
// 伪代码:

let deleted = ArrayList<T>()

for ((key, value) in map) {
	// 收集所有(不)满足条件的 key 值
	if (xxx) {
		deleted.add(key)
	}
}

map.remove(all : deleted)

正常情况下 "直接删除数据" 与 "批量删除数据" 的性能差异并不大,以 HashMap 为例:

Ubuntu 20.04 平台下进行测试。