当前位置: 首页 > news >正文

lua中table键类型及lua中table的初始化有几种方式

在 Lua 中,table 的键几乎可以是任何类型,但有几个重要的规则和最佳实践需要了解。

1. 主要键类型

(1) 字符串 (string)

这是最常见、最推荐的键类型。

local person = {name = "Alice", -- 等同于 ["name"] = "Alice"["age"] = 30    -- 当键名复杂时,必须用方括号
}
(2) 数字 (number)

数字键通常用于实现 “数组”。Lua 数组默认从索引 1 开始。

local fruits = {"apple", "banana"} -- fruits[1], fruits[2]
fruits[100] = "orange" -- 也可以使用任意数字作为键

⚠️ 注意:数字 0 也是一个有效的键,但它不属于默认的数组部分。

(3) 布尔值 (boolean)

布尔值 true 和 false 也可以作为键。

local settings = {[true] = "开启状态",[false] = "关闭状态"
}
(4) 表 (table) / 函数 (function) / 用户数据 (userdata)

这些都是 “引用类型”,只有当它们是同一个对象时,才会被视为同一个键。

local t1 = {}
local t2 = {}
local t3 = t1local cache = {[t1] = "这是t1",[function() end] = "这是一个匿名函数"
}print(cache[t3]) -- 输出 "这是t1",因为 t3 和 t1 是同一个表
print(cache[t2]) -- 输出 nil,因为 t2 是另一个不同的表

2. 两个关键规则

  1. nil 键是无效的
    将 nil 赋值给一个键会删除该键值对。

    local t = {key = "value"}
    t.key = nil -- t 现在变成了空表 {}
    
  2. 数字 0 和字符串 "0" 是不同的键
    Lua 会区分键的类型。

    local t = {[0] = "数字0", ["0"] = "字符串0"}
    print(t[0])     -- 输出 "数字0"
    print(t["0"])   -- 输出 "字符串0"
    

3. 遍历与键类型

不同的遍历方式会处理不同类型的键:

  • ipairs: 只遍历连续的、从 1 开始的数字键
  • pairs: 遍历所有类型的键(除了 nil)。

总结与建议

键类型描述推荐场景
字符串最常用,可读性好,性能稳定首选。用于表示配置、对象属性等。
数字用于实现数组和有序列表需要按顺序访问一组数据时使用。
布尔值只有两个可能的值适用于简单的二态配置。
引用类型(表 / 函数等)用作临时缓存的键高级用法,如实现备忘录模式或对象唯一标识。

在 Lua 中初始化 table 主要有以下几种方式,从简单到复杂排列:

1. 创建空表

最基础的方式,创建一个没有任何元素的 table。

local t = {}

2. 列表式初始化

用于创建数组或线性表,索引会自动从 1 开始递增。

local fruits = {"apple", "banana", "orange"}
-- fruits[1] = "apple", fruits[2] = "banana"

3. 键值对式初始化

用于创建字典或映射,可以自定义任何类型的键(通常是字符串)。

local person = {name = "Alice",age = 30,isStudent = false
}
-- 等同于 person["name"] = person.name = "Alice"

4. 混合初始化

在一个 table 中同时包含列表部分和键值对部分。

local data = {-- 列表部分"Lua", "Python", "JavaScript",-- 键值对部分creator = "Guido van Rossum", -- 注意:这里是个小陷阱!rating = 9.5
}

⚠️ 重要陷阱:在混合初始化中,所有列表项的自动索引会在所有键值对之前被分配。上面的例子中,data[1] = "Lua", data[2] = "Python", data[3] = "JavaScript"。

5. 计算式初始化

在初始化时,用方括号 [] 来包裹表达式,动态计算键名。这对于使用非字符串作为键或动态生成键名非常有用。

local key_name = "score"
local config = {["player-id"] = 12345, -- 使用特殊字符的字符串键[key_name] = 90,       -- 使用变量作为键[os.time()] = "start"  -- 使用函数调用结果作为键
}

6. 构造函数式初始化

通过在 table 构造器中调用函数,可以在创建 table 的同时执行复杂的初始化逻辑。

local function build_user(id)return {id = id,token = "token_" .. id}
endlocal user = build_user(101)
-- user = { id = 101, token = "token_101" }


这些初始化方式是 Lua 中非常基础且重要的知识点。


文章转载自:

http://vV8stL57.hryhq.cn
http://AMfmUXFr.hryhq.cn
http://Xw1pY6Mo.hryhq.cn
http://NPYw9m4Y.hryhq.cn
http://fYgyeHfD.hryhq.cn
http://UEhk8AQv.hryhq.cn
http://03pNDHfF.hryhq.cn
http://LsHCmhjf.hryhq.cn
http://TXfCO2IM.hryhq.cn
http://BD5SmeZS.hryhq.cn
http://Sg0yCZHS.hryhq.cn
http://Mn9octny.hryhq.cn
http://EgVrQuQl.hryhq.cn
http://2EGhet1i.hryhq.cn
http://2YGKkjub.hryhq.cn
http://lUMsuekV.hryhq.cn
http://H8znJbyT.hryhq.cn
http://OHOWzx9Y.hryhq.cn
http://dxsCFKjJ.hryhq.cn
http://O0AxMiET.hryhq.cn
http://GPnMUf2E.hryhq.cn
http://a3i4eus4.hryhq.cn
http://Vh8D1HRt.hryhq.cn
http://Wg7CbnUW.hryhq.cn
http://0Ul24BcT.hryhq.cn
http://f6SyOLEr.hryhq.cn
http://N4QXhALU.hryhq.cn
http://f3af44Hp.hryhq.cn
http://hLVkUyDe.hryhq.cn
http://ummu4v0S.hryhq.cn
http://www.dtcms.com/a/371715.html

相关文章:

  • 【CMake】缓存变量
  • Flink NetworkBufferPool核心原理解析
  • python数据可视化之Matplotlib(8)-Matplotlib样式系统深度解析:从入门到企业级应用
  • Recharts:React图表库,组件化设计助力高效数据可视化开发
  • Linux知识清单
  • SpringMVC 入门详解: MVC 思想(附核心流程)
  • CMake简易使用教程
  • daily notes[13]
  • Solana 核心概念:计算单元与交易成本解析
  • 【系统分析师】第11章-关键技术:软件需求工程(核心总结)
  • 如何通过日志先行原则保障数据持久化:Redis AOF 和 MySQL redo log 的对比
  • 做好LoRaWAN的传感器都需要实现哪些功能点?
  • React入门 | React 新手入门与常用库和工具
  • jvm问题排查
  • C/C++数据结构之栈基础
  • 【Qt】项目的创建和各个控件的使用
  • Python高级技巧(七):装饰器
  • C#有人IO模块USR-IO808的完整指南
  • Apache Dubbo学习笔记-使用Dubbo发布、调用服务
  • CTFshow系列——PHP特性Web97-
  • Photoshop - Photoshop 创建图层蒙版
  • DevOps实战(3) - 使用Arbess+GitLab+Hadess实现Java项目自动化部署
  • Python从入门到精通_00_初识python
  • LabVIEW 与 PLC 通讯
  • 项目介绍:图像分类项目的最小可用骨架--代码细节讲解
  • 【.Net技术栈梳理】01-核心框架与运行时(CLR与GC)
  • 简述ajax、node.js、webpack、git
  • Java安全体系深度研究:技术演进与攻防实践
  • Drupal XSS漏洞复现:原理详解+环境搭建+渗透实践(CVE-2019-6341)
  • Mybatis常见问题