在 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://www.pswp.cn/web/96193.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96193.shtml
英文地址,请注明出处:http://en.pswp.cn/web/96193.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matlab实现利用双MZI产生RZ33-QPSK信号

利用MATLAB实现双MZI产生RZ33-QPSK信号的代码: 参数设置 % 信号参数 fs 1e6; % 采样频率 fc 10e6; % 载波频率 T 1e-6; % 符号周期 N 1000; % 采样点数 t 0:1/fs:(N-1)/fs; % 时间向量生成QPSK信号 % 生成随机二进制序列 data randi([0,1],1,N);% 将二进制序列…

Vue响应式更新 vs React状态更新:两种范式的底层逻辑与实践差异

在现代前端框架中,Vue和React作为两大主流选择,分别采用了截然不同的状态管理与更新机制。Vue的“响应式更新”通过自动追踪依赖实现数据与视图的联动,而React的“状态更新”则依赖显式setState触发重新渲染。本文将从底层原理、更新流程、优…

Spring MVC 的常用注解

一、控制器相关注解ControllerController注解用于标记一个类为 Spring MVC 的控制器。在 Spring MVC 框架里,控制器扮演着关键角色,负责接收 HTTP 请求并返回响应。当一个类被Controller注解标记后,Spring 容器会自动识别并将其纳入管理。例如…

Oracle APEX 利用卡片实现翻转(方法一)

目录 0. 以 Oracle 的标准示例表 EMP 为例,实现卡片翻转 1. 创建PL/SQL动态内容区域 2. 添加 CSS 实现翻转效果 3. 添加动态操作 (Dynamic Action) 4. 看效果 0. 以 Oracle 的标准示例表 EMP 为例,实现卡片翻转 正面: 显示员工姓名 (EN…

Gradio全解11——Streaming:流式传输的视频应用(1)——FastRTC:Python实时通信库

Gradio全解11——Streaming:流式传输的视频应用(1)——FastRTC:Python实时通信库前言第11章 Streaming:流式传输的视频应用11.1 FastRTC:Python实时通信库11.1.1 WebRTC协议与FastRTC介绍1. WebRTC协议的概…

一文学会二叉搜索树,AVL树,红黑树

文章目录二叉搜索树查找插入删除AVL树概念插入旋转AVL验证红黑树概念插入检测二叉搜索树 也称二叉排序树或二叉查找树 二叉搜索树:可以为空,若不为空满足以下性质 ⭐1,非空左子树小于根节点的值 ⭐2,非空右子大于根节点的值 ⭐3…

Android实战进阶 - 启动页

场景:当启动页处于倒计时阶段,用户将其切换为后台的多任务卡片状态,倒计时会继续执行,直到最后执行相关逻辑(一般会跳转引导页、进入主页等) 期望:而综合市场来看,一般我们期望的是当…

无标记点动捕技术:重塑展厅展馆的沉浸式数字交互新时代

在元宇宙浪潮的持续推进下,虚拟数字人正逐渐成为连接虚实世界的重要媒介。在展厅展馆中,数字人不仅能够扮演导览员、讲解员角色,更可通过情感化交互提升参观体验,使文化传播更具感染力和沉浸感。虚拟人的引入,为传统展…

轻松Linux-7.Ext系列文件系统

天朗气清,惠风和煦,今日无事,遂来更新。 1.概述 总所周知,我们存的数据都是在一个叫硬盘的东西里面,这个硬盘又像个黑盒,这章就来简单解析一下Linux中文件系统。 现在我们用的大都是固态硬盘,…

Matlab机器人工具箱使用4 蒙特卡洛法绘制工作区间

原理:利用rand随机数,给各个关节设置随机关节变量,通过正运动学得到末端位姿变换矩阵,然后利用变换矩阵2三维坐标标记出末端坐标,迭代多次就可以构成点云。教程视频:【MATLAB机器人工具箱10.4 机械臂仿真教…

【项目】在AUTODL上使用langchain实现《红楼梦》知识图谱和RAG混合检索(三)知识图谱和路由部分

首先在数据集 - 开放知识图谱下载红楼梦的知识图谱,这个网站上有各种各样的知识图谱,可以挑你感兴趣的做( • ̀ω•́ ) 这个知识图谱的作者们已经将三元组抽取出来了,我们可以直接用,如果你对三元组是如何生成的感兴趣&#xf…

pycharm 最新版上一次编辑位置

2025nipycharm方法一:用快捷键(最方便)跳回上一次编辑位置:Windows/Linux: Ctrl Alt ←macOS: ⌘ Option ←跳到前一次位置:Windows/Linux: Ctrl Alt →macOS: ⌘ Option →方法二:显示工具栏按钮在…

前端性能监控与优化:从 Lighthouse 到 APM

在当今竞争激烈的数字环境中,用户对Web应用性能的要求日益提高。一个缓慢或响应迟钝的应用不仅会流失用户,更可能损害品牌形象和商业价值。因此,前端性能的监控与优化已成为前端开发不可或缺的关键环节。本文将深入探讨从基础的性能评估工具L…

TC_Motion多轴运动-电子齿轮

目录 电子齿轮 【基本概念】 【应用示例】 【开发总结】 END 电子齿轮 【基本概念】 定义:通过软件方法实现机械齿轮的速比调节功能(两个轴成线性比例旋转) 优点 免维护,告别机械损耗 易调节,任意修改齿轮比 精度高,无机械背隙 应用场景 多台电机拖动同一负载,要求多台…

CentOS 7 下载教程

访问阿里云镜像站 阿里巴巴开源镜像站 选择centos 点这个 选择7版本 进入isos目录 点这个 选择这个版本 因为这个镜像的日期更新 推荐下载 DVD 版:包含完整系统和常用软件,无需额外联网安装组件Minimal 版:精简版,仅包含基础系…

MAC在home下新建文件夹报错“mkdir: test: Operation not supported”

在Mac电脑中,home文件夹下不能直接mkdir,sudo 也还是不行,提示“mkdir: test: Operation not supported”。网上找的解决方案不好使,因为没有关闭系统完整性保护关闭系统完整性保护查看SIP当前的状态csrutil status如果是开启状态…

交叉导轨从测试仪到工作台的精密运动控制

在精密仪器领域微米级的运动精度与纳米级的稳定性往往是决定设备性能上限的核心指标。而支撑这一技术鸿沟跨越的,往往隐匿于机械结构的“毫厘之间”——交叉导轨。以下是其在不同精密仪器中的具体应用:光学测试仪:光学测试仪主要用于各种高精…

内网穿透的应用-Navidrome与cpolar本地搭建跨网络访问的云音乐服务器

文章目录前言1. 安装Docker2. 创建并启动Navidrome容器3. 公网远程访问本地Navidrome3.1 内网穿透工具安装3.2 创建远程连接公网地址3.3 使用固定公网地址远程访问前言 音乐收藏存在平台版权限制、音质压缩和访问不便等问题。Navidrome 开源音乐服务器与 cpolar 内网穿透服务的…

FastAPI 访问不了API文档或配置不生效的解决方法

FastAPI中文教程 本文背景 FastAPI框架自带交互式api文档,通过路由/docs或者/redoc 访问,但是FastAPI 的文档界面(如 /docs 和 /redoc)依赖于外部的 JavaScript 和 CSS 库,如果项目部署环境网络不佳或者无法访问外网的时候&…

IAR 集成开发环境入门指南:字体设置与调试实战

一、IAR 的基本使用教程1. IAR 颜色字体大小设置打开设置路径:点击顶部菜单栏 Tools → 选择 Options,打开 IDE 配置窗口。进入字体颜色设置界面:在弹出的 “IDE Options” 窗口中,双击展开 Editor 选项,然后点击 Colo…