忿忿的泥巴坨 发表于 2024-12-31 14:30:01

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
-- 实验修改常量会引发错误
https://i-blog.csdnimg.cn/direct/e6769cdd7ff047b89fde56938f57b5ad.png
 
lua: const.lua:4: Attempt to modify a constant value
stack traceback:
        : in function 'error'
        const.lua:4: in function <const.lua:3>
        const.lua:8: in main chunk
        : ?
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);
https://i-blog.csdnimg.cn/direct/579c51ff0daa402797c03d88478404ba.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Lua语言入门 - Lua常量