원클릭으로
cangjie-extension
仓颉语言扩展。当需要了解仓颉语言的直接扩展(extend)、接口扩展、泛型扩展、扩展中的访问规则、孤儿规则、导出与导入规则等特性时,应使用此 Skill。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
仓颉语言扩展。当需要了解仓颉语言的直接扩展(extend)、接口扩展、泛型扩展、扩展中的访问规则、孤儿规则、导出与导入规则等特性时,应使用此 Skill。
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
通用算法与数据结构实现参考——排序、搜索、动态规划、图算法、字符串处理的多语言惯用写法和模板代码(Python/C++/Java/Go/Cangjie)
仓颉语言算法与数据结构实现参考——排序、搜索、动态规划、图算法、字符串处理、集合操作的惯用写法和模板代码
仓颉编程语言基本概念和规则,当需要了解关键字、标识符、程序结构、变量定义(let/var/const)、值类型与引用类型、作用域规则、表达式(if/while/for-in/break/continue)、函数等基本概念时,应使用此 Skill
仓颉语言基本数据类型。当需要了解仓颉语言的整数、浮点、布尔、字符(Rune)、字符串(String)、Unit、Nothing、元组(Tuple)、数组(Array/VArray)、区间(Range)类型以及基本运算符的语法和规则时,应使用此 Skill。
仓颉程序与C程序互操作指导,包括foreign声明、CFunc、inout参数、unsafe块、调用约定、类型映射(基础类型/结构体/CPointer/VArray/CString)、C回调仓颉、内存管理等特性时,应使用此 Skill
仓颉语言类。当需要了解仓颉语言的类定义、抽象类、构造函数(init/主构造函数)、终结器(~init)、继承(单继承/sealed)、重写(override)、重定义(redef)、成员变量、成员函数、属性(prop)、访问修饰符、This类型、对象创建等特性时,应使用此 Skill。
| name | cangjie-extension |
| description | 仓颉语言扩展。当需要了解仓颉语言的直接扩展(extend)、接口扩展、泛型扩展、扩展中的访问规则、孤儿规则、导出与导入规则等特性时,应使用此 Skill。 |
扩展为当前包中任何可见类型添加新功能 — 函数、元组和接口除外。
get/set)open、override 或 redefprivate 成员extend String {
public func printSize() {
println("the size is ${this.size}")
}
}
main() {
let a = "123"
a.printSize() // 输出:the size is 3
}
class Boo {
var boo: Int64 = 2
}
extend Boo {
public prop x: Int64 { // 添加成员属性
get() { 123 }
}
public operator func -(): Int64 { // 添加运算符重载
-x
}
}
形式 A:扩展完全实例化的泛型类型:
class Foo<T> where T <: ToString {}
extend Foo<Int64> { ... } // 仅适用于 Foo<Int64>
形式 B:带新类型参数的泛型扩展:
class MyList<T> {}
extend<T> MyList<T> { ... }
extend<T, R> MyList<(T, R)> { ... }
extend 后声明的每个类型参数须在被扩展类型中使用// ❌ 错误示例
extend MyList {} // Error: 泛型类型须带类型实参
extend<T, R> MyList<T> {} // Error: R 未被使用
where 子句限制扩展成员的可用条件:class Pair<T1, T2> {
var first: T1
var second: T2
public init(a: T1, b: T2) {
first = a
second = b
}
}
interface Eq<T> {
func equals(other: T): Bool
}
// 仅当 T1、T2 支持判等时,Pair 才有 equals 方法
extend<T1, T2> Pair<T1, T2> where T1 <: Eq<T1>, T2 <: Eq<T2> {
public func equals(other: Pair<T1, T2>): Bool {
first.equals(other.first) && second.equals(other.second)
}
}
interface PrintSizeable {
func printSize(): Unit
}
extend<T> Array<T> <: PrintSizeable {
public func printSize() {
println("The size is ${this.size}")
}
}
main() {
let a: PrintSizeable = Array<Int64>()
a.printSize() // 输出:The size is 0
}
使用 & 在一个扩展中实现多个接口:
interface I1 { func f1(): Unit }
interface I2 { func f2(): Unit }
interface I3 { func f3(): Unit }
class Foo {}
extend Foo <: I1 & I2 & I3 {
public func f1(): Unit {}
public func f2(): Unit {}
public func f3(): Unit {}
}
若类型已有所需成员,扩展体可为空:
interface Sizeable {
prop size: Int64
}
extend<T> Array<T> <: Sizeable {} // Array 已有 prop size
main() {
let a: Sizeable = Array<Int64>()
println(a.size) // 输出:0
}
不能重新实现已存在的成员
interface I1 {
func foo(): Unit { println("I1 foo") }
}
interface I2 <: I1 {
func foo(): Unit { println("I2 foo") }
}
class A {}
extend A <: I1 {} // 先检查
extend A <: I2 {} // 后检查,I2.foo 覆盖 I1.foo
main() {
A().foo() // 输出:I2 foo
}
// 当 T1、T2 可判等时,让 Pair 实现 Eq 接口
extend<T1, T2> Pair<T1, T2> <: Eq<Pair<T1, T2>> where T1 <: Eq<T1>, T2 <: Eq<T2> {
public func equals(other: Pair<T1, T2>): Bool {
first.equals(other.first) && second.equals(other.second)
}
}
public class A {}
public extend A {} // ❌ Error: 扩展前不能有修饰符
允许:static、public、protected、internal、private、mut
| 修饰符 | 作用域 |
|---|---|
private | 仅在扩展块内 |
internal | 当前包及子包(默认) |
protected | 当前模块 |
public | 全局可见 |
static | 仅通过类型名访问 |
mut | 结构体扩展中的可变函数 |
不允许用于扩展成员的修饰符:open、override、redef
mut 函数struct Counter {
var count: Int64 = 0
}
extend Counter {
public mut func increment() {
count += 1
}
}
main() {
var c = Counter() // 须为 var 才能调用 mut 函数
c.increment()
println(c.count) // 输出:1
}
不能为接口和类型均来自不同包的情况实现接口。扩展须与被扩展类型或接口(含接口继承链上的所有接口)在同一个包中。
// package a
public class Foo {}
// package b
public interface Bar {}
// package c
import a.Foo
import b.Bar
extend Foo <: Bar {} // ❌ Error: 孤儿扩展
// 须在 package a 或 package b 中为 Foo 实现 Bar
this 和 superthis(可省略)superclass A {
var v = 0
}
extend A {
func f() {
print(this.v) // OK
print(v) // OK,省略 this
}
}
private 成员扩展不能读写被扩展类型的 private 成员。protected 及以上可访问
class A {
private var v1 = 0
protected var v2 = 0
}
extend A {
func f() {
print(v1) // ❌ Error: 不能访问 private 成员
print(v2) // OK
}
}
class A {
func f() {}
}
extend A {
func f() {} // ❌ Error: 不能遮蔽已有成员
}
// 两个扩展之间也不能遮蔽
extend A {
func g() {}
}
extend A {
func g() {} // ❌ Error
}
private 成员可从另一个扩展调用private 成员仅限于其自己的扩展块class Foo {}
extend Foo {
private func f() {}
func g() {} // 默认 internal
}
extend Foo {
func h() {
g() // OK: 可访问其他扩展的非 private 成员
f() // ❌ Error: f 是 private
}
}
open class A {}
class B <: A {}
class E<X> {}
interface I1 { func f1(): Unit }
interface I2 { func f2(): Unit }
extend<X> E<X> <: I1 where X <: B { // 扩展 1(更严格)
public func f1(): Unit {
f2() // OK: 较宽松扩展的成员可见
}
}
extend<X> E<X> <: I2 where X <: A { // 扩展 2(更宽松)
public func f2(): Unit {
f1() // ❌ Error: 较严格扩展的成员不可见
}
}
import 扩展本身// package a
package a
public class Foo {}
extend Foo {
public func f() {}
}
// package b
package b
import a.Foo
public interface I { func g(): Unit }
extend Foo <: I {
public func g() { this.f() } // OK
}
// package c — 使用扩展
package c
import a.Foo
import b.I
func test() {
let a = Foo()
a.f() // OK:直接扩展随 Foo 导入
a.g() // OK:已导入 Foo 和 I
}