Lua 语言本身对变量命名没有强制的语法规范(除了不能以数字开头、不能使用保留字),但在实际工程和社区中,已经形成了一套广泛认可的约定俗成的规范。遵循这些规范能显著提升代码的可读性和可维护性。
以下是 Lua 社区主流的变量命名规范总结:
1. 基本规则(语法层面)- ✅ 只能包含 字母、数字、下划线 _
- ❌ 不能以数字开头(如 3dModel 非法)
- ❌ 不能使用 Lua 保留字(如 and, break, do, else, elseif, end, false, for, function, goto, if, in, local, nil, not, or, repeat, return, then, true, until, while)
- ⚠️ 避免以下划线开头后接大写字母(如 _VERSION),这类命名被 Lua 内部保留用于全局特殊变量
2. 风格约定(社区惯例)变量类型 命名风格 示例 说明
局部变量 / 函数参数 snake_case player_name, max_hp Lua 最主流的风格,与标准库一致
模块级私有变量 _snake_case _cache, _internal_state 前缀下划线表示"内部使用,勿外部访问"
常量 UPPER_SNAKE_CASE MAX_RETRY_COUNT, DEFAULT_TIMEOUT 全大写+下划线,表示不应修改的值
类/模块名 PascalCase PlayerController, HttpUtils 用于面向对象风格的类或模块表
布尔变量 is_/has_/can_ 前缀 is_alive, has_permission 让条件判断读起来像自然语言
循环变量 单字母 i, j, k, n 仅用于短作用域的迭代器 3. 重要注意事项🔑 始终优先使用 local-- ❌ 错误:意外创建全局变量,污染全局环境且性能差count = 0-- ✅ 正确:显式声明局部变量local count = 0原因:Lua 的全局变量存储在 _ENV 表中,每次访问都是表查找;而 local 变量直接通过寄存器访问,性能差距可达数倍。这也是为什么几乎所有 Lua 风格指南都把"避免全局变量"作为第一条规则。
🛡️ 防止拼写错误导致隐式全局变量推荐使用 Luacheck 等静态分析工具,它能检测出未声明的变量赋值(通常是拼写错误):
luacheck your_script.lua# 警告: assigning to undeclared global 'conut' (did you mean 'count'?)📦 模块导出命名local M = {} -- 模块表用大写 M 是常见惯例M.player_count = 0 -- 公开 API 用 snake_caselocal _secret = "xxx" -- 私有成员用下划线前缀return M4. 知名项目的风格参考- OpenResty / Kong:严格 snake_case + local,常量 UPPER_CASE
- LÖVE (游戏框架):API 用 camelCase(历史原因),但用户代码推荐 snake_case
- Roblox Luau:官方风格指南推荐 camelCase 用于变量,PascalCase 用于类——这是少数例外,因为 Roblox 生态偏向 TypeScript/C# 风格
|