写 {1,2,3} 的时候,主键 1、2、3 去哪了?为什么两份看起来一样的表,比起来却不相等?
本课互动训练:专属动画 + 选择题测验。 打开 第 05 课 · 动画闯关,先看动画,再完成 3 道选择题。
配套动画实验室:堆 / 栈 / 引用 / # 号可点可演。 打开 Lua 表 · 堆栈内存动画实验室,对照本文点「播放当前演示」。local t = {1, 2, 3, 4, 5}
等价于:
local t = {
[1] = 1,
[2] = 2,
[3] = 3,
[4] = 4,
[5] = 5,
}
Lua 帮你把主键写好了,只是没显示。这叫隐式;你亲手写出 [1]= 这种,叫显式。功能一样,外观不同。
== 却是 falselocal t1 = {1, 2, 3, 4, 5}
local t3 = {1, 2, 3, 4, 5}
print(t1 == t3) --> false
内容一模一样,怎么不相等?
因为表比较的是内存地址,不是内容。
创建 t1 时,Lua 在内存(堆)里圈了一块地存数据,t1 是指向这块地的「门牌号」。创建 t3 又圈了另一块地。两个门牌号不同,所以 == 为 false。
print(123 == 123) --> true
print("你好" == "你好") --> true
print({} == {}) --> false
数字、字符串是按值比,表是按引用(地址)比。这是新手第一个真正要背下来的内存常识。
local a = {1, 2, 3, 4}
local b = a
print(b[3]) --> 3
b = a 不是把表拷贝了一份,而是让 b 也指向同一块内存。两把钥匙,同一扇门。
于是:
local a = {1, 2, 3, 4}
local b = a
b[3] = 100
print(a[3]) --> 100
改 b 就是改 a。很多「我明明没改它怎么变了」的 bug,都是引用没想清。
==今日练习:写两份相同内容的表,验证 == 为 false;再写 b = a 后改 b[1],观察 a[1] 是否跟着变。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
会判断了,就能做会回话的 NPC。今天拼一个简易 GM 工具界面。 一、用 say 吐出界面 客户端编辑器 Ctrl + F…
与或非听起来玄,其实就是三张通行证。 一、and(与)= 过安检 机票 + 身份证 ,少一样不让过。后面还能无限加条件。 二…
判断 = 比较 + 分支。今天把三种 if 写法、以及工程里最好用的「防卫语句」一次练透。 一、三种判断结构 elseif …
表会建、会取、会增删改查,最后一环是 遍历 。本篇先把坑标出来,下节课正式拆迭代器。 本课互动训练 :专属动画 + 选择题测…
「我只改了 b,a 怎么变了?」——这是表引用问题的标准嚎叫。今天把钥匙和锁彻底讲清。 本课互动训练 :专属动画 + 选择题…
理论够了,进游戏干一票:用一张表,存下角色的名、级、包、属性,并用它驱动「给我装备」。 本课互动训练 :专属动画 + 选择题…