拓冰建站拓冰建站
首页 / 资讯中心 / 正文

从chat4cj学Cangjie:通过Rocket.Chat客户端掌握仓颉语言10个核心特性

从chat4cj学Cangjie通过Rocket.Chat客户端掌握仓颉语言10个核心特性【免费下载链接】chat4cjRocket.Chat Cangjie 语言客户端项目地址: https://gitcode.com/Cangjie-TPC/chat4cjchat4cj 是一个用Cangjie仓颉语言编写的Rocket.Chat 客户端库把聊天服务器最实用的 RestAPI——登录认证、频道管理、群组管理、消息收发全部封装成简洁易用的类。对新手来说它代码量不大、结构清晰是读一个真实项目学仓颉的理想教材。下面我们就结合这份源码带你掌握仓颉语言的 10 个核心特性 项目初印象代码在哪里先认识一下核心文件后文每个特性都会回到这些位置文件作用chat/src/main/cangjie/rest_api.cjRestAPI主类封装全部接口方法chat/src/main/cangjie/http_request_connector.cj底层 HTTP 请求连接器chat/src/main/cangjie/package.cj包声明与内部依赖entry/src/main/cangjie/rest_api_sample.cj界面示例按钮一键调用各接口entry/src/main/cangjie/rest_api_sample_entity.cj序列化实体类示例doc/feature_api.md完整 API 文档想动手的话clone 仓库后用 DevEco Studio配合 Cangjie Support 插件直接打开即可git clone https://gitcode.com/Cangjie-TPC/chat4cj特性一包系统——package 与 import仓颉用package声明文件所属的包用import引入其他包。package.cj 里可以看到包的完整形态package chat internal import httpclient4cj.* internal import encoding.json.* internal import net.http.*package chat声明本包名为chatinternal import仅包内可见的依赖把实现细节藏起来外部使用时只需一行import chat.*就能调用全部公开 API这是仓颉模块化组织代码的基本方式比所有代码堆在一个文件清晰得多。特性二类、成员变量与 init 构造器rest_api.cj 中的RestAPI类是一个标准示范public class RestAPI { private var username: String private var credentialKey: String public init(url: String, username: String, credentialKey: String) { this.username username this.credentialKey credentialKey } }三个要点一次看懂public/private访问控制成员变量默认私有init构造器初始化器支持命名参数this.xxx显式指向当前实例的成员特性三let 与 var——常量和变量的分界private let DEFAULT_TIMEOUT: Int 60000 // 常量定义后不可再改 var url users.list?query${query}fields${fields} // 变量可重新赋值let定义不可变常量var定义可变变量习惯与 Swift、Kotlin 一致编译器能自动推断类型url不需要写String${...}是字符串插值直接把变量嵌进字符串比拼接符方便特性四func 函数定义与返回值// 获取已加入的频道列表 public func joinListChannel(): String { let response this.httpRequestConnector.get(channels.list.joined, ) return response.toJsonString() }用func声明函数参数名: 类型写在括号里冒号后面跟返回类型如: String无返回值可写: Unit或省略这个调用连接器 → 转成 JSON 字符串 → 返回的三段式结构在RestAPI类里重复了上百次非常适合作为入门阅读模板特性五Option 可选类型——优雅应对缺失数据解析 JSON 时字段可能缺失仓颉用Option类型表达可能有、也可能没有。登录逻辑中就有一处经典用法rest_api.cjif (let Some(body) - json_data.get(body)) { let bodyObj body.asObject() let data (bodyObj.get(data).getOrThrow() as JsonObject).getOrThrow() let authToken (data.get(authToken).getOrThrow() as JsonString).getOrThrow().getValue() this.httpRequestConnector.setUserData(authToken.getValue(), userId.getValue()) }let Some(body) - ...是仓颉的解构绑定值是Some就绑定给body并执行代码块是None则直接跳过从语言层面规避空指针问题。配合getOrThrow()取值失败抛异常数据访问既安全又直接。特性六match 模式匹配——告别冗长 if-elsehttp_request_connector.cj 里按 HTTP 方法分发请求match写得非常干净match (method) { case GET requestBuilder.get() case POST requestBuilder.post( RealRequestBody.create(MediaType.get(application/json; charsetutf-8), data)) case DELETE requestBuilder.delete(...) case _ throw Exception(Unsupported HTTP method: ${method}) }每个case匹配一种情况后面写要执行的动作case _是兜底分支类似 Java 的defaultmatch还能匹配类型如case data: DataModelStruct 比 if-else 链更不易漏判特性七try/catch 异常处理try { let response this.httpRequestConnector.get(url, ) return response.toJsonString() } catch (e: Exception) { return handleException(e) }写法与 Java 几乎一致catch里可以注明异常类型更值得学的是兜底思路handleException把异常转成格式统一的 JSONsuccess、code、errmsg三个字段保证 API 无论成败返回结构都一致调用方解析起来省心特性八泛型与标准库集合示例代码里到处是泛型容器rest_api_sample.cjvar active: Bool true var roles: ArrayString [user] // 字符串数组 let visitor Visitor(访客小明, 111xx.com, aaa, 13611111111, [CustomFields(address, A省B市C区XXX, true)]) // 对象数组 var token: ArrayListString ArrayListString(1) // 动态列表ArrayT/ArrayListT是泛型容器尖括号里写元素类型标准库的JsonObject、JsonArray负责 JSON 构建put和add是出现频率最高的两个操作字面量数组[...]直接书写简洁直观特性九: 继承特质与序列化rest_api_sample_entity.cj 中的实体类展示了仓颉的实现/继承语法:public class PostMessageData : SerializablePostMessageData { var channel: String var text: String public func serialize(): DataModel { return DataModelStruct() .add(fieldString(channel, channel)) .add(fieldString(text, text)) } }:表示实现某个特质trait这里实现SerializablePostMessageDataserialize()把字段逐个登记进统一的DataModel之后一行data.serialize().toJson().asObject().toJsonString()就能产出接口要的 JSON 字符串——这就是示例代码里所有按钮对象变 JSON的统一套路特性十spawn 协程——UI 不卡死的关键网络请求绝不能阻塞界面。示例代码统一用spawn把调用丢到后台协程rest_api_sample.cjimport ohos.concurrency.launch .onClick { spawn { let res restAPI.login() Hilog.info(0, RestAPI, res:${res}) } }{ ... }是匿名函数闭包写法spawn { ... }启动一个轻量协程界面保持流畅这是仓颉结构化并发的入门形态代码仍是顺序书写却没有线程管理的烦恼学习路线小结按这个顺序通读一遍10 个特性就都落袋为安了 ✅顺序文件收获1chat/src/main/cangjie/package.cj包与导入2chat/src/main/cangjie/rest_api.cj类、函数、Option、try/catch3chat/src/main/cangjie/http_request_connector.cjmatch、构造器、常量4entry/src/main/cangjie/rest_api_sample_entity.cj泛型、序列化特质5entry/src/main/cangjie/rest_api_sample.cj闭包、spawn 并发、UI 调用chat4cj 的价值不只是能调 Rocket.Chat更在于它用不到千行的代码把仓颉语言面向对象、类型安全、并发协程的特点都自然地展示了出来。读完它再去写自己的第一个仓颉项目会轻松很多 【免费下载链接】chat4cjRocket.Chat Cangjie 语言客户端项目地址: https://gitcode.com/Cangjie-TPC/chat4cj创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门