Lua语言入门 - Lua常量

在Lua中,虽然没有直接的常量关键字(如C++中的`const`),但你可以通过一些编程技巧和约定来实现类似常量的行为。以下是几种常见的方法:

1. 使用全局变量并命名规范

你可以定义一个全局变量,并通过命名约定来表示它是一个常量。例如,使用全大写字母来命名常量。

复制代码
```lua
MY_CONSTANT = 42

print(MY_CONSTANT)  -- 输出: 42
```

虽然这种方法不能防止变量被修改,但通过命名约定可以提醒开发者不要修改这些值。

2. 使用元表(Metatable)

你可以使用元表来控制对表的访问,从而模拟常量行为。

复制代码
local constants = {};
setmetatable(constants, {
    __newindex = function(t, key, value)
        error("Attempt to modify a constant value")
    end
})

constants.PI = 3.14159;

print(constants.PI)  -- 输出: 3.14159

-- 尝试修改常量会引发错误

复制代码
lua: const.lua:4: Attempt to modify a constant value
stack traceback:
	[C]: in function 'error'
	const.lua:4: in function <const.lua:3>
	const.lua:8: in main chunk
	[C]: ?

3. 使用模块和私有变量

你可以将常量放在一个模块中,并使用局部变量来存储它们,这样外部代码无法直接访问这些变量。```lua

复制代码
-- constants.lua
local M = {}
local privateConstants = {
    PI = 3.14159,
    E = 2.71828
}

function M.getPI()
    return privateConstants.PI
end

function M.getE()
    return privateConstants.E
end

return M

```

然后在其他文件中使用这个模块:

```lua

复制代码
local constants = require("constants")

print(constants.getPI())  -- 输出: 3.14159
print(constants.getE())   -- 输出: 2.71828

```

4. 使用只读属性(Read-Only Property)

如果你使用的是Lua 5.3或更高版本,可以使用`__index`元方法来实现只读属性。

```lua

复制代码
local constants = setmetatable({}, {
    __index = function(t, key)
        if key == "PI" then
            return 3.14159
        elseif key == "E" then
            return 2.71828
        else
            error("Invalid constant name")
        end
    end,
    __newindex = function(t, key, value)
        error("Attempt to modify a constant value")
    end
})

print(constants.PI)  -- 输出: 3.14159
print(constants.E)   -- 输出: 2.71828

-- 尝试修改常量会引发错误

constants.PI = 3.14 -- 报错: Attempt to modify a constant value

```

5.函数+表

复制代码
function Supermarket()
	local tabDefinition =
	{
		Candy = 1;
		Cookie = 2;
		Jelly = 3;
	};

	return tabDefinition;
end

print("Candy", Supermarket().Candy);
print("Cookie", Supermarket().Cookie);
print("Jelly", Supermarket().Jelly);
Supermarket().Jelly = 5;
print("Candy", Supermarket().Candy);
相关推荐
吴声子夜歌1 小时前
ApacheCommons——commons-pool2(高性能通用对象池框架)
java·开发语言·apache
kruptos7 小时前
分布式系统怎么“选主“?Raft 共识一次讲清
开发语言·分布式·php·共识算法
xcl09257 小时前
幼儿托育系统开发实战:从需求分析到上线全流程指南
java·大数据·需求分析
吴声子夜歌7 小时前
ApacheCommons——commons-cli(命令行参数解析)
java·开发语言·apache
小小猪的春天7 小时前
Java 手写第一个 MCP Server:Spring AI MCP 半小时跑通
java·人工智能·spring boot·ai编程
find1star7 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
今天AI了吗8 小时前
DeepSeek Harness 深度解析:从评测架构到实战落地
java·网络·数据库·人工智能·架构·java-ee
benchmark_cc8 小时前
REST API 和 Python SDK 应该怎么选?量化交易数据接口选型实战
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
王的宝库8 小时前
Go 项目结构:从单文件到标准工程布局
开发语言·后端·golang
Tairitsu_H8 小时前
[C++] 深入理解红黑树:封装set与map
开发语言·c++·set·map·红黑树·模拟实现