const
SKILL.md
仓颉语言 const 变量与 const 函数 Skill
1. const 变量
1.1 基本语法
const G = 6.674e-11
- 使用
const修饰符声明,表示编译时常量,深度不可变 - 不能省略初始化器
- 可用于全局、局部或静态成员(不可在扩展中)
1.2 与 let/var 的区别
let:不可变,只能赋值一次,运行时绑定var:可变,可多次赋值const:编译时常量,深度不可变,初始化表达式必须是 const 表达式
2. const 表达式
可在编译时求值的表达式,包括:
- 数值类型、
Bool、Unit、Rune、String(不包含插值字符串)的字面量 - 所有元素都是 const 表达式的
Array字面量(不能是Array类型,可以使用VArray类型)和元组字面量 const变量、const函数形参、const函数中的局部变量const函数,包含使用const声明的函数名、符合const函数要求的lambda、以及这些函数返回的函数表达式const函数调用(包含const构造函数),该函数的表达式必须是 const 表达式,所有实参必须都是 const 表达式- 所有参数都是 const 表达式的
enum构造器调用,和无参数的enum构造器 - 数值类型、
Bool、Unit、Rune、String类型的算术表达式、关系表达式、位运算表达式,所有操作数都必须是 const 表达式 if、match、try、throw、return、is、as— 这些表达式内的表达式必须都是 const 表达式- const 表达式的成员访问(不包含属性的访问),元组的索引访问
const init和const函数中的this和super表达式const表达式的const实例成员函数调用,且所有实参必须都是 const 表达式
3. const 函数
3.1 基本语法
const func distance(a: Point, b: Point) {
let dx = a.x - b.x
let dy = a.y - b.y
(dx ** 2 + dy ** 2) ** 0.5
}
- 用
const修饰符声明 - 在
const上下文中 → 编译时求值;在非const上下文中 → 运行时求值
3.2 规则
const函数声明必须使用const修饰- 全局
const函数和static const函数中只能访问const声明的外部变量(包含const全局变量、const静态成员变量)。const init函数和const实例成员函数除了能访问const声明的外部变量,还可以访问当前类型的实例成员变量 const函数中的表达式都必须是 const 表达式(const init函数除外)const函数中可以使用let、const声明新的局部变量,但不支持varconst函数中的参数类型和返回类型没有特殊规定。如果该函数调用的实参不符合 const 表达式要求,那这个函数调用不能作为 const 表达式使用,但仍然可以作为普通表达式使用const函数不一定都会在编译时执行,例如可以在非const函数中运行时调用const函数与非const函数重载规则一致- 数值类型、
Bool、Unit、Rune、String类型和enum支持定义const实例成员函数 - 对于
struct和class,只有定义了const init才能定义const实例成员函数。class中的const实例成员函数不能是open的。struct中的const实例成员函数不能是mut的
3.3 接口中的 const 函数
- 接口中的
const函数,实现类型必须也用const函数才算实现接口 - 接口中的非
const函数,实现类型使用const或非const函数都算实现接口 - 接口中的
const函数与接口的static函数一样,只有在该接口作为泛型约束的时候,受约束的泛型变元或变量才能使用这些const函数
interface I {
const func f(): Int64
const static func f2(): Int64
}
class A <: I {
public const func f() { 0 }
public const static func f2() { 1 }
const init() {}
}
const func g<T>(i: T) where T <: I {
return i.f() + T.f2()
}
4. const init
如果一个 struct 或 class 定义了 const 构造器,那么这个 struct/class 实例可以用在 const 表达式中。
4.1 基本语法
struct Point {
const Point(let x: Float64, let y: Float64) {}
}
4.2 规则
- class 规则:不能具有
var声明的实例成员变量;如果当前类型具有父类,当前的const init必须调用父类的const init(可以显式调用或者隐式调用无参const init),如果父类没有const init则报错 - 当前类型的实例成员变量如果有初始值,初始值必须要是 const 表达式,否则不允许定义
const init const init内可以使用赋值表达式=对实例成员变量赋值,除此以外不能有其他赋值表达式(如+=、-=)const init与const函数的区别是const init内允许对实例成员变量进行赋值(需要使用赋值表达式)
4.3 完整示例
struct Point {
const Point(let x: Float64, let y: Float64) {}
}
const func distance(a: Point, b: Point) {
let dx = a.x - b.x
let dy = a.y - b.y
(dx ** 2 + dy ** 2) ** 0.5
}
main() {
const a = Point(3.0, 0.0)
const b = Point(0.0, 4.0)
const d = distance(a, b)
println(d) // 输出 5.000000
}
Weekly Installs
2
Repository
kong-baiming/cangjie-devFirst Seen
3 days ago
Security Audits
Installed on
amp1
cline1
opencode1
cursor1
kimi-cli1
codex1