万恶起源——为程序元素命名
对于熟悉其他编程语言的读者或者不在意较多细节内容的读者,可以跳过本节内容或者直接总结查看部分
1.3.1 什么是标识符?
在编程中,标识符就是给程序中的各种元素起的名字,比如变量名、函数名等。就好比现实生活中给人起名字一样,仓颉语言对"名字"有一些规则要求。
仓颉的标识符分为两类:
- 普通标识符 —— 最常用的命名方式
- 原始标识符 —— 一种特殊的命名方式,允许使用关键字作为名字
下面我们分别介绍。
1.3.2 普通标识符
命名规则
普通标识符的命名规则可以简单理解为:
- 开头字符只能是:中文字符、英文字母、下划线(
_)、其他符合XID_Start的字符 - 开头之后可以接:中文字符、英文字母、数字、下划线、其他符合XID_Continue的字符
- 不能与仓颉的关键字相同(如
main、for、while、spawn等)
数字不能开头!3abc 是非法的。
另外,如果用下划线 _ 开头,后面至少要跟一个字符,不能只有一个孤零零的 _。
此处并非指_不能作为标识符使用,见Q2。
示例
// ✅ 合法的普通标识符
hello // 英文字母开头
test
Demo
_abc_ // 下划线开头,后面有字符
仓颉 // 中文开头
a1b1c1 // 字母开头,后面接数字
// ❌ 非法的普通标识符
ab&c // & 不是合法字符
3abc // 数字不能作为开头
while // while 是仓颉关键字,普通标识符不能用
1.3.3 原始标识符
为什么需要原始标识符?
有时候你可能需要用仓颉的关键字(如 if、while)作为名字,但普通标识符不允许这样做。这时候就可以用原始标识符。
使用方式
在普通标识符或关键字的外面加上一对反引号(` `)即可:
// ✅ 合法的原始标识符
`abc` // 普通标识符加反引号
`_abc`
`a1b2c3`
`if` // 关键字加反引号,现在可以作为名字使用了
`while`
// ❌ 非法的原始标识符
`ab&c` // 内部的普通标识符本身就不合法
`3abc` // 同上,数字不能开头
使用场景
下方代码暂时看不懂也没有关系, 后续会详细学习
main() {
let a = 1
a |> println
`test`() // 如果 test 是关键字,可以用反引号包裹
}
func `test`() {
}
1.3.4 关于 Unicode 字符集(选读)
本节内容偏底层细节,初学者可以跳过,了解"标识符支持中文和英文开头"即可。
仓颉的标识符规则基于 Unicode 标准 15.0.0,涉及两个核心概念:
- XID_Start:可以作为标识符开头的字符集合,包含中文、英文字母等
- XID_Continue:可以作为标识符后续字符的集合,包含中文、英文字母、阿拉伯数字等
也就是说,前面说的"开头字符"和"后续字符"的规则,本质上就是 XID_Start 和 XID_Continue 的定义。
此外,仓颉会对所有标识符进行 NFC 规范化。简单来说,如果两个标识符在 NFC 后长得一样,它们会被视为同一个标识符。
详细定义可参考 Unicode 标准文档
1.3.5 总结
| 类型 | 规则 | 示例 |
|---|---|---|
| 普通标识符 | 中文/字母/_ 开头,后接中文/字母/数字/_(不可单独出现);不能是关键字 |
hello、仓颉、_abc |
| 原始标识符 | 用反引号包裹普通标识符或关键字 | `if`、`while`、`abc` |
一句话记忆:普通标识符用中文/字母/下划线开头,不能是关键字;想用关键字当名字就加反引号。
1.3.6 常见问题
Q1:可以用中文命名变量吗?
可以!仓颉支持中文字符作为标识符,这是仓颉的特色之一:
let 年龄 = 18
let 姓名 = "张三"
虽然技术上完全合法,但在实际项目中,建议在使用英文命名,避免出现编码错误。
Q2:为什么 `_` 不能单独作标识符?
在仓颉中,单独的 _ 有特殊用途——它表示"我不在乎这个值",常用于忽略不需要的变量。比如从函数返回多个值时,用 _ 表示"这个返回值我不需要"。
let (name, _) = ("小明", 18) // 只关心 name,不关心年龄
所以 _ 被保留作特殊用法,不能当作普通标识符。
Q3:关键字有多少个?我该怎么记住?
仓颉有几十个关键字,包括 main、if、else、for、while、let、var、func、class、struct 等等。
不需要死记硬背! 你只需要知道:
- 使用普通标识符时,如果编译器报错说"这个是关键字",换个名字就行
- 实在想用关键字做名字,加反引号用原始标识符
