diff --git a/skills/basic_data_type/SKILL.md b/skills/basic_data_type/SKILL.md index 0f0b9f7..4560a39 100644 --- a/skills/basic_data_type/SKILL.md +++ b/skills/basic_data_type/SKILL.md @@ -144,8 +144,21 @@ description: "仓颉语言基本数据类型。当需要了解仓颉语言的整 ### 5.4 支持的运算 - 关系运算符用于比较 - `+` 用于拼接 +- `*` 用于重复:`"ab" * 3` → `"ababab"` -### 5.5 字符串迭代 +### 5.5 常用方法 +- `s.size` — UTF-8 字节长度(非字符数) +- `s.isEmpty()` — 是否为空串 +- `s.contains(sub)` — 是否包含子串 +- `s.split(sep)` — 按分隔符分割,返回 `Array` +- `s.replace(old, new)` — 替换所有匹配子串 +- `s.trimAscii()` — 裁剪两端 ASCII 空白 +- `s.startsWith(prefix)` / `s.endsWith(suffix)` — 前缀/后缀检查 +- `s.indexOf(sub)` — 查找子串位置,返回 `?Int64` + +> 完整 String API 请参阅 `cangjie-std-string` Skill + +### 5.6 字符串迭代 - **`for (c in s)` 迭代的是字节(`UInt8`/`Byte`)**,因为 `String` 实现了 `Collection`(UTF-8 编码字节序列) - **`for (c in s.runes())` 迭代的是字符(`Rune`)**,返回 `Iterator` - 这与大多数编程语言的行为不同,需要特别注意: diff --git a/skills/basic_programming_concepts/SKILL.md b/skills/basic_programming_concepts/SKILL.md index 5520fb9..233e688 100644 --- a/skills/basic_programming_concepts/SKILL.md +++ b/skills/basic_programming_concepts/SKILL.md @@ -100,6 +100,8 @@ description: "仓颉语言基本编程概念。当需要了解仓颉语言的标 - `break` 退出循环,`continue` 跳至下一次迭代 - 二者的类型均为 `Nothing` +> **相关 Skill**:`match` 表达式和模式匹配详见 `cangjie-pattern-match` Skill;异常处理(`try`/`catch`/`throw`)详见 `cangjie-error-handle` Skill;Lambda 表达式和闭包详见 `cangjie-function` Skill + --- ## 4. 函数(基本概念) diff --git a/skills/class/SKILL.md b/skills/class/SKILL.md index 8a1b30e..4ed713f 100644 --- a/skills/class/SKILL.md +++ b/skills/class/SKILL.md @@ -97,7 +97,8 @@ description: "仓颉语言类。当需要了解仓颉语言的类定义、抽象 - `sealed abstract class` — 仅同包内可继承 - `sealed` 隐含 `public`/`open` 语义 - `sealed` 的子类可不是 `sealed`,仍可被 `open`/`sealed` 修饰 -- 若子类被 `open` 修饰,则其子类可在包外被继承 +- 若子类被 `open` 修饰且不被 `sealed` 修饰,则其子类可在包外被继承 +- `sealed` 类适用于限定继承范围,常与 `match` 穷举检查配合使用 ### 3.3 父类构造函数调用 - 在子类 `init` 中:使用 `super(args)` 或 `this(args)` 作为函数体**第一个表达式**(互斥) diff --git a/skills/collections/SKILL.md b/skills/collections/SKILL.md index 2e42968..783f0c6 100644 --- a/skills/collections/SKILL.md +++ b/skills/collections/SKILL.md @@ -79,6 +79,7 @@ HashMap(10, {x: Int64 => (x, x * x)}) // size=10,lambda - **size 属性**:`map.size` - **contains**:`map.contains("a")` → `Bool` - **按键下标**:`map["a"]` — 键须存在否则**运行时异常** +- **安全访问**:`map.get("a")` — 返回 `?V`,键不存在时返回 `None`(不抛异常) ### 3.3 修改 - **下标赋值(更新)**:`map["a"] = 3` diff --git a/skills/concurrency/SKILL.md b/skills/concurrency/SKILL.md index c40a0b9..7f56512 100644 --- a/skills/concurrency/SKILL.md +++ b/skills/concurrency/SKILL.md @@ -45,8 +45,7 @@ main(): Int64 { ### 3.1 `sleep()` 函数 - **签名**:`func sleep(dur: Duration): Unit` -- 阻塞当前线程至少 `dur` 时长 -- **规则**:若 `dur <= Duration.Zero`,线程仅**让出**执行资源而不睡眠 +- **规则**:阻塞当前线程**至少** `dur` 时长(实际可能略长)。若 `dur <= Duration.Zero`,线程仅**让出**执行资源而不睡眠 --- diff --git a/skills/error_handle/SKILL.md b/skills/error_handle/SKILL.md index b118f6e..c67566e 100644 --- a/skills/error_handle/SKILL.md +++ b/skills/error_handle/SKILL.md @@ -142,8 +142,14 @@ match (p) { | 异常 | 说明 | |------|------| -| `ConcurrentModificationException` | 并发修改错误 | +| `ArithmeticException` | 算术错误(如除以零) | +| `ConcurrentModificationException` | 迭代过程中集合被修改 | | `IllegalArgumentException` | 非法或不正确的参数 | +| `IllegalStateException` | 对象处于非法状态 | +| `IndexOutOfBoundsException` | 数组/集合索引越界 | | `NegativeArraySizeException` | 以负数大小创建数组 | -| `NoneValueException` | 值不存在 | +| `NoneValueException` | 尝试访问不存在的值(如对 `None` 解包) | +| `NullPointerException` | 空指针访问 | | `OverflowException` | 算术溢出 | +| `UnsupportedException` | 不支持的操作 | +| `TimeoutException` | 操作超时 | diff --git a/skills/macro/SKILL.md b/skills/macro/SKILL.md index 379e904..c060023 100644 --- a/skills/macro/SKILL.md +++ b/skills/macro/SKILL.md @@ -115,8 +115,8 @@ description: "仓颉语言宏。当需要了解仓颉语言的Token/Tokens类型 | `parseType(Tokens)` | 解析为类型节点 `TypeNode` | | `parsePattern(Tokens)` | 解析为模式节点 `Pattern` | | `parseProgram(Tokens)` | 解析整个源文件为 `Program` 节点 | -| `parseExprFragment(Tokens, Int64)` | 部分解析表达式,返回 `(Expr, Int64)` | -| `parseDeclFragment(Tokens, Int64)` | 部分解析声明,返回 `(Decl, Int64)` | +| `parseExprFragment(Tokens, Int64)` | 从指定偏移处部分解析表达式,返回 `(Expr, Int64)` — 第二个 `Int64` 为解析结束后的新偏移 | +| `parseDeclFragment(Tokens, Int64)` | 从指定偏移处部分解析声明,返回 `(Decl, Int64)` — 第二个 `Int64` 为解析结束后的新偏移 | 也可通过直接构造函数创建节点:`BinaryExpr(quote(a + b))`、`FuncDecl(quote(func f1(...) {...}))` 等 diff --git a/skills/stdx/SKILL.md b/skills/stdx/SKILL.md index 6ab2fb7..c664c3f 100644 --- a/skills/stdx/SKILL.md +++ b/skills/stdx/SKILL.md @@ -45,56 +45,23 @@ stdx 是仓颉编程语言的**扩展标准库**(非核心标准库),提 **发行版下载页面**:https://gitcode.com/Cangjie/cangjie_stdx/releases -根据操作系统和架构选择对应的发行版(如 `linux_x86_64_cjnative`、`windows_x86_64_cjnative` 等),下载并解压。 - -解压后目录结构示例: - -```text -stdx/ -├── dynamic/ # 动态库 -│ └── stdx/ -└── static/ # 静态库 - └── stdx/ -``` +根据操作系统和架构选择对应的发行版,下载并解压。解压后包含 `dynamic/stdx/`(动态库)和 `static/stdx/`(静态库)两个目录。 ### 2.2 配置 cjpm.toml -在仓颉项目的 `cjpm.toml` 文件中添加 `bin-dependencies` 配置: - -**步骤 1**:获取系统架构信息 - -```shell -cjc -v -# 输出示例: -# Cangjie Compiler: 0.60.5 (cjnative) -# Target: x86_64-unknown-linux-gnu -``` - -**步骤 2**:在 `cjpm.toml` 中添加配置 +在仓颉项目的 `cjpm.toml` 文件中添加 `bin-dependencies` 配置。先运行 `cjc -v` 获取系统架构信息(如 `x86_64-unknown-linux-gnu`),然后添加: ```toml [package] name = "myproject" version = "1.0.0" output-type = "executable" - compile-option = "" - [dependencies] - -# Linux x86_64 示例 +# 根据 cjc -v 输出的 Target 选择对应的 target 段 [target.x86_64-unknown-linux-gnu] [target.x86_64-unknown-linux-gnu.bin-dependencies] path-option = ["/path/to/stdx/dynamic/stdx"] # 替换为实际 stdx 路径 - -# Windows x86_64 示例 -# [target.x86_64-w64-mingw32] -# [target.x86_64-w64-mingw32.bin-dependencies] -# path-option = ["D:\\path\\to\\stdx\\dynamic\\stdx"] - -# macOS aarch64 示例 -# [target.aarch64-apple-darwin] -# [target.aarch64-apple-darwin.bin-dependencies] -# path-option = ["/path/to/stdx/dynamic/stdx"] +# Windows 使用 x86_64-w64-mingw32,macOS 使用 aarch64-apple-darwin ``` > **说明**: @@ -105,12 +72,10 @@ cjc -v ### 2.3 导入使用 ```cangjie -import stdx.net.http.* // HTTP 包 -import stdx.encoding.json.* // JSON 包 -import stdx.encoding.base64.* // Base64 包 -import stdx.log.* // 日志 API 包 -import stdx.crypto.digest.* // 摘要算法包 -// 等等... +import stdx.net.http.* // HTTP +import stdx.encoding.json.* // JSON +import stdx.log.* // 日志 +// 其他包类似:stdx.encoding.base64.*, stdx.crypto.digest.* 等 ``` --- @@ -125,119 +90,51 @@ import stdx.crypto.digest.* // 摘要算法包 ```cangjie import stdx.net.http.* - main() { - // 1. 构建 Server - let server = ServerBuilder() - .addr("127.0.0.1") - .port(8080) - .build() - - // 2. 注册路由处理器 + let server = ServerBuilder().addr("127.0.0.1").port(8080).build() server.distributor.register("/hello", {httpContext => httpContext.responseBuilder.body("Hello 仓颉!") }) - - server.distributor.register("/json", {httpContext => - httpContext.responseBuilder - .header("Content-Type", "application/json") - .body("{\"msg\": \"ok\"}") - }) - - // 3. 启动服务 server.serve() } ``` -#### ServerBuilder 常用配置 - -```cangjie -let server = ServerBuilder() - .addr("0.0.0.0") // 监听地址 - .port(8080) // 监听端口 - .readTimeout(Duration.second * 30) // 读超时 - .writeTimeout(Duration.second * 30) // 写超时 - .maxRequestBodySize(10 * 1024 * 1024) // 最大请求体 10MB - .build() -``` - -#### 关闭服务 - -```cangjie -server.close() // 立即关闭 -server.closeGracefully() // 优雅关闭(等待进行中的请求完成) -``` +ServerBuilder 还支持 `readTimeout`、`writeTimeout`、`maxRequestBodySize` 等配置。关闭服务使用 `server.close()` 或 `server.closeGracefully()`(优雅关闭)。 ### 3.2 创建 HTTP 客户端 ```cangjie import stdx.net.http.* - main() { - // 1. 构建 Client let client = ClientBuilder().build() - - // 2. 发送 GET 请求 let response = client.get("http://127.0.0.1:8080/hello") - println(response.status) // 200 - - // 3. 读取响应体 let body = StringReader(response.body).readToEnd() - println(body) // "Hello 仓颉!" - - // 4. 发送 POST 请求 - let postResp = client.post("http://127.0.0.1:8080/api", - "{\"name\": \"test\"}") - - // 5. 自定义请求 + let postResp = client.post("http://127.0.0.1:8080/api", "{\"name\": \"test\"}") + // 自定义请求(PUT/DELETE 等)使用 HttpRequestBuilder let req = HttpRequestBuilder() - .url("http://127.0.0.1:8080/api") - .method("PUT") + .url("http://127.0.0.1:8080/api").method("PUT") .header("Content-Type", "application/json") - .body("{\"key\": \"value\"}") - .build() + .body("{\"key\": \"value\"}").build() let resp = client.send(req) - client.close() } ``` -#### ClientBuilder 常用配置 - -```cangjie -let client = ClientBuilder() - .readTimeout(Duration.second * 10) // 读超时 - .writeTimeout(Duration.second * 10) // 写超时 - .autoRedirect(true) // 自动跟随重定向 - .cookieJar(CookieJar()) // Cookie 管理 - .httpProxy("http://proxy:3128") // HTTP 代理 - .build() -``` +ClientBuilder 还支持 `readTimeout`、`writeTimeout`、`autoRedirect`、`cookieJar`、`httpProxy` 等配置选项。 ### 3.3 WebSocket ```cangjie import stdx.net.http.* -// 客户端 WebSocket 连接 let client = ClientBuilder().build() let (ws, headers) = WebSocket.upgradeFromClient( - client, - URL.parse("ws://127.0.0.1:8080/ws"), - HTTP1_1, - ArrayList(), - HttpHeaders() + client, URL.parse("ws://127.0.0.1:8080/ws"), + HTTP1_1, ArrayList(), HttpHeaders() ) - -// 发送文本帧 -ws.write(TextWebFrame, "Hello WebSocket".toArray()) - -// 读取帧 -let frame = ws.read() -println(String.fromUtf8(frame.payload)) - -// 关闭连接 -ws.writeCloseFrame(status: 1000) +ws.write(TextWebFrame, "Hello WebSocket".toArray()) // 发送 +let frame = ws.read() // 接收 +ws.writeCloseFrame(status: 1000) // 关闭 ``` ### 3.4 HTTPS(TLS 配置) @@ -246,21 +143,14 @@ ws.writeCloseFrame(status: 1000) import stdx.net.http.* import stdx.net.tls.* -// 服务端 HTTPS -let server = ServerBuilder() - .addr("0.0.0.0") - .port(443) - .tlsConfig(TlsServerConfig( - certFilePath: "/path/to/cert.pem", - keyFilePath: "/path/to/key.pem" - )) +// 服务端 HTTPS — 通过 tlsConfig 配置证书 +let server = ServerBuilder().addr("0.0.0.0").port(443) + .tlsConfig(TlsServerConfig(certFilePath: "/path/to/cert.pem", keyFilePath: "/path/to/key.pem")) .build() -// 客户端 HTTPS +// 客户端 HTTPS — 配置 CA 证书 let client = ClientBuilder() - .tlsConfig(TlsClientConfig( - caCertFilePath: "/path/to/ca.pem" - )) + .tlsConfig(TlsClientConfig(caCertFilePath: "/path/to/ca.pem")) .build() ``` @@ -276,65 +166,31 @@ let client = ClientBuilder() ```cangjie import stdx.encoding.json.* - -// 从字符串解析 let jsonStr = """{"name": "Alice", "age": 30, "scores": [90, 85]}""" -let jsonVal = JsonValue.fromStr(jsonStr) - -// 访问字段 -let obj = jsonVal.asObject() +let obj = JsonValue.fromStr(jsonStr).asObject() let name = obj["name"].asString().getValue() // "Alice" let age = obj["age"].asInt().getValue() // 30 -let scores = obj["scores"].asArray() -let first = scores[0].asInt().getValue() // 90 ``` #### 构建 JSON ```cangjie import stdx.encoding.json.* - let obj = JsonObject() obj.put("name", JsonString("Bob")) obj.put("age", JsonInt(25)) obj.put("active", JsonBool(true)) - let arr = JsonArray() arr.add(JsonInt(1)) -arr.add(JsonInt(2)) obj.put("tags", arr) - -// 序列化为字符串 -let jsonStr = obj.toJsonString() -// {"name": "Bob", "age": 25, "active": true, "tags": [1, 2]} +let jsonStr = obj.toJsonString() // {"name":"Bob","age":25,"active":true,"tags":[1]} ``` #### JsonValue 类型体系 -| 类型 | 对应 JSON | 获取值方法 | -|------|-----------|------------| -| `JsonObject` | `{...}` | `get(key)`, `operator[]` | -| `JsonArray` | `[...]` | `get(index)`, `operator[]` | -| `JsonString` | `"..."` | `getValue(): String` | -| `JsonInt` | 整数 | `getValue(): Int64` | -| `JsonFloat` | 浮点数 | `getValue(): Float64` | -| `JsonBool` | `true/false` | `getValue(): Bool` | -| `JsonNull` | `null` | — | +类型:`JsonObject`(`{...}`)、`JsonArray`(`[...]`)、`JsonString`、`JsonInt`、`JsonFloat`、`JsonBool`、`JsonNull`。各类型通过 `getValue()` 获取原始值,通过 `get(key)`/`operator[]` 访问子元素。 -#### 类型判断 - -```cangjie -let val = JsonValue.fromStr(jsonStr) -match (val.kind()) { - case JsObject => let obj = val.asObject() - case JsArray => let arr = val.asArray() - case JsString => let s = val.asString().getValue() - case JsInt => let i = val.asInt().getValue() - case JsFloat => let f = val.asFloat().getValue() - case JsBool => let b = val.asBool().getValue() - case JsNull => // null -} -``` +通过 `val.kind()` 判断类型(`JsObject`、`JsArray`、`JsString`、`JsInt`、`JsFloat`、`JsBool`、`JsNull`),然后用 `match` 进行分支处理,调用对应的 `asObject()`、`asArray()` 等方法转换。 ### 4.2 JSON 流式序列化(stdx.encoding.json.stream) @@ -342,42 +198,30 @@ match (val.kind()) { 适合将自定义类型与 JSON 进行互转。 -#### 序列化(对象 → JSON 流) +#### 序列化(JsonWriter:对象 → JSON 流) ```cangjie import stdx.encoding.json.stream.* import std.io.* - let output = ByteArrayOutputStream() let writer = JsonWriter(output) - writer.startObject() .writeName("name").writeValue("Alice") .writeName("age").writeValue(30) - .writeName("scores") - .startArray() - .writeValue(90).writeValue(85) - .endArray() + .writeName("scores").startArray().writeValue(90).writeValue(85).endArray() .endObject() writer.flush() - -let jsonStr = String.fromUtf8(output.toByteArray()) -// {"name":"Alice","age":30,"scores":[90,85]} +// 结果:{"name":"Alice","age":30,"scores":[90,85]} ``` -#### 反序列化(JSON 流 → 对象) +#### 反序列化(JsonReader:JSON 流 → 对象) ```cangjie -import stdx.encoding.json.stream.* -import std.io.* - let input = ByteArrayInputStream(jsonStr.toArray()) let reader = JsonReader(input) - reader.startObject() while (reader.peek() != None) { - let key = reader.readName() - match (key) { + match (reader.readName()) { case "name" => let name: String = reader.readValue() case "age" => let age: Int64 = reader.readValue() case _ => reader.skip() @@ -386,37 +230,7 @@ while (reader.peek() != None) { reader.endObject() ``` -#### 自定义类型序列化 - -```cangjie -import stdx.encoding.json.stream.* - -class Person <: JsonSerializable & JsonDeserializable { - var name: String - var age: Int64 - - public func toJson(writer: JsonWriter): Unit { - writer.startObject() - .writeName("name").writeValue(name) - .writeName("age").writeValue(age) - .endObject() - } - - public static func fromJson(reader: JsonReader): Person { - let p = Person() - reader.startObject() - while (reader.peek() != None) { - match (reader.readName()) { - case "name" => p.name = reader.readValue() - case "age" => p.age = reader.readValue() - case _ => reader.skip() - } - } - reader.endObject() - return p - } -} -``` +自定义类型可通过实现 `JsonSerializable` 和 `JsonDeserializable` 接口支持序列化,在 `toJson(writer)` 和 `fromJson(reader)` 方法中使用上述 `JsonWriter`/`JsonReader` API 进行读写。 --- @@ -428,17 +242,8 @@ class Person <: JsonSerializable & JsonDeserializable { ```cangjie import stdx.encoding.base64.* - -// 编码 -let encoded = toBase64String([77, 97, 110]) // "TWFu" - -// 解码 -let decoded = fromBase64String("TWFu") // [77, 97, 110] - -// 常用场景:二进制数据转文本传输 -let data = "Hello".toArray() -let b64 = toBase64String(data) -let original = fromBase64String(b64) +let encoded = toBase64String("Hello".toArray()) // 编码为 Base64 字符串 +let decoded = fromBase64String(encoded) // 解码回字节数组 ``` ### 5.2 Hex(stdx.encoding.hex) @@ -447,11 +252,7 @@ let original = fromBase64String(b64) ```cangjie import stdx.encoding.hex.* - -// 编码 let hexStr = toHexString([65, 66, 94, 97]) // "41425e61" - -// 解码 let bytes = fromHexString("41425e61") // [65, 66, 94, 97] ``` @@ -461,20 +262,10 @@ let bytes = fromHexString("41425e61") // [65, 66, 94, 97] ```cangjie import stdx.encoding.url.* - -// 解析 URL let url = URL.parse("https://example.com:8080/api/v1?key=value#section") -println(url.scheme) // "https" -println(url.host) // "example.com" -println(url.port) // 8080 -println(url.path) // "/api/v1" -println(url.query) // "key=value" -println(url.fragment) // "section" - -// URL 表单参数处理 +// 可访问 url.scheme、url.host、url.port、url.path、url.query、url.fragment let form = Form() form.add("name", "张三") -form.add("age", "30") let encoded = form.toString() // URL 编码后的参数字符串 ``` @@ -492,16 +283,12 @@ let encoded = form.toString() // URL 编码后的参数字符串 ```cangjie import stdx.crypto.digest.* - -// SHA256 摘要 let sha = SHA256() sha.update("Hello".toArray()) -let hash = sha.finish() // 返回摘要字节数组 - -// HMAC +let hash = sha.finish() // SHA256 摘要 let hmac = HMAC(SHA256(), key) hmac.update("message".toArray()) -let mac = hmac.finish() +let mac = hmac.finish() // HMAC 摘要 ``` ### 6.2 对称加密(stdx.crypto.crypto) @@ -552,19 +339,7 @@ let mac = hmac.finish() **导入**:`import stdx.log.*` -提供抽象日志接口,不依赖具体实现。 - -```cangjie -import stdx.log.* - -// 获取全局 Logger -let logger = getGlobalLogger() - -// 设置全局 Logger -setGlobalLogger(myLogger) - -// 日志级别:TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF -``` +提供抽象日志接口。通过 `getGlobalLogger()` / `setGlobalLogger(myLogger)` 管理全局 Logger。日志级别:TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF。 ### 8.2 日志实现(stdx.logger) @@ -581,31 +356,17 @@ let logger = SimpleLogger("MyApp") setGlobalLogger(logger) logger.info("Server started", ("port", 8080)) // 输出:2025-04-15T10:30:00Z INFO Server started port=8080 - // 2. TextLogger — 键值对文本格式 let textLogger = TextLogger("MyApp") textLogger.info("Request received", ("method", "GET"), ("path", "/api")) // 输出:time=2025-04-15T10:30:00Z level=INFO msg="Request received" method=GET path=/api - // 3. JsonLogger — JSON 格式 let jsonLogger = JsonLogger("MyApp") jsonLogger.info("Event", ("user", "alice")) // 输出:{"time":"...","level":"INFO","msg":"Event","user":"alice"} ``` -#### 日志方法 - -```cangjie -logger.trace("详细跟踪信息") -logger.debug("调试信息") -logger.info("一般信息", ("key", "value")) -logger.warn("警告信息") -logger.error("错误信息", ("error", errMsg)) -logger.fatal("致命错误") - -// 惰性求值(仅在日志级别启用时计算) -logger.trace({=> "expensive computation: ${compute()}"}) -``` +所有 Logger 支持 `trace`、`debug`、`info`、`warn`、`error`、`fatal` 方法,可附带键值对属性。支持惰性求值:`logger.trace({=> "expensive: ${compute()}"})`. --- @@ -626,21 +387,13 @@ logger.trace({=> "expensive computation: ${compute()}"}) ```cangjie import stdx.serialization.* - class Person <: Serializable { var name: String var age: Int64 - public func serialize(): DataModel { - DataModelStruct() - .add(field("name", DataModelString(name))) - .add(field("age", DataModelInt(age))) - } - - public static func deserialize(dm: DataModel): Person { - // 从 DataModel 还原对象 - ... + DataModelStruct().add(field("name", DataModelString(name))).add(field("age", DataModelInt(age))) } + public static func deserialize(dm: DataModel): Person { /* 从 DataModel 还原对象 */ } } ``` @@ -663,25 +416,16 @@ class Person <: Serializable { | `DecompressInputStream` | 解压输入流 | | `DecompressOutputStream` | 解压输出流 | -### 压缩级别 - -- `CompressLevel.Fast` — 速度优先 -- `CompressLevel.Default` — 默认平衡 -- `CompressLevel.High` — 压缩率优先 +### 压缩级别与格式 -### 数据格式 - -- `WrapType.DeflateFormat` — deflate-raw 格式 -- `WrapType.GzipFormat` — gzip 格式 +- 压缩级别:`CompressLevel.Fast`(速度优先)、`Default`(默认)、`High`(压缩率优先) +- 数据格式:`WrapType.DeflateFormat`(deflate-raw)、`WrapType.GzipFormat`(gzip) ```cangjie import stdx.compress.zlib.* -// 压缩 -let compressed = CompressInputStream(inputStream, wrap: GzipFormat) - -// 解压 -let decompressed = DecompressInputStream(compressedStream, wrap: GzipFormat) +let compressed = CompressInputStream(inputStream, wrap: GzipFormat) // 压缩 +let decompressed = DecompressInputStream(compressedStream, wrap: GzipFormat) // 解压 ``` --- @@ -751,69 +495,7 @@ let decompressed = DecompressInputStream(compressedStream, wrap: GzipFormat) --- -## 14. 快速上手示例 - -### 14.1 HTTP 服务 + JSON 响应 - -```cangjie -import stdx.net.http.* -import stdx.encoding.json.* - -main() { - let server = ServerBuilder() - .addr("127.0.0.1") - .port(8080) - .build() - - server.distributor.register("/api/user", {ctx => - let obj = JsonObject() - obj.put("name", JsonString("Alice")) - obj.put("age", JsonInt(30)) - ctx.responseBuilder - .header("Content-Type", "application/json") - .body(obj.toJsonString()) - }) - - server.serve() -} -``` - -### 14.2 HTTP 客户端请求 + JSON 解析 - -```cangjie -import stdx.net.http.* -import stdx.encoding.json.* -import std.io.* - -main() { - let client = ClientBuilder().build() - let resp = client.get("http://127.0.0.1:8080/api/user") - let body = StringReader(resp.body).readToEnd() - let json = JsonValue.fromStr(body) - let name = json.asObject()["name"].asString().getValue() - println("Name: ${name}") - client.close() -} -``` - -### 14.3 日志记录 - -```cangjie -import stdx.log.* -import stdx.logger.* - -main() { - let logger = SimpleLogger("MyApp") - setGlobalLogger(logger) - logger.info("Application started", ("version", "1.0.0")) - logger.debug("Processing request", ("path", "/api")) - logger.error("Something went wrong", ("code", 500)) -} -``` - ---- - -## 15. 注意事项 +## 14. 注意事项 | 要点 | 说明 | |------|------| diff --git a/skills/struct/SKILL.md b/skills/struct/SKILL.md index 3db95f6..f64cf5e 100644 --- a/skills/struct/SKILL.md +++ b/skills/struct/SKILL.md @@ -127,8 +127,18 @@ public mut operator func +(rhs: A): A { A() } // 合法 ### 3.6 `mut` 函数中 `this` 的限制 - `this` **不能被** Lambda 或嵌套函数捕获 -- `this` **不能作为表达式使用**(如返回值) +- `this` **不能作为表达式使用**(如返回值、赋给变量) - 实例成员变量**不能被** `mut` 函数内的 Lambda 捕获 +```cangjie +struct Foo { + var i = 0 + public mut func f(): Unit { + // let t = this // 错误:this 不能作为表达式 + // let f = { => i } // 错误:不能捕获 mut 函数中的实例成员 + i += 1 // 正确:可以直接修改 + } +} +``` ### 3.7 接口中的 `mut` - 接口函数可声明为 `mut`