Lua技术疑问:a.x与a[x]的运行结果差异及底层逻辑区别
Lua table 索引语法的核心差异
你遇到的问题本质是Lua对两种table取值语法的设计规则完全不同,这也是Lua新手最容易踩的坑之一:
- 点语法
a.xxx是固定语法糖,等价于a["xxx"]:点后面的内容只会被识别为字符串字面量,不会当做变量解析,也不会执行任何表达式计算 - 方括号语法
a[xxx]是动态索引:会先计算括号内表达式的结果,再用这个结果作为键访问table
第一个示例解释
a = {} x = "y" a[x] = 10 print(a[x]) -- 输出10 print(a.x) -- 输出nil print(a.y) -- 输出10
- 执行
a[x] = 10时,方括号先计算变量x的值为字符串"y",实际是给a["y"]赋值为10 print(a[x])同理取x的值"y"作为键,所以输出10a.x等价于a["x"],你从未给a的"x"键赋值,自然返回nila.y等价于a["y"],和你赋值的键一致,所以输出10
第二个示例解释
你给出的第二个示例中第三行打印代码存在书写笔误,正确写法应为invitems[string.lower(name)](使用方括号而非点),否则运行时会报错,对应逻辑解释如下:
invitems = {} name = string.lower(name) -- 假设初始name为"Knife",执行后值为"knife" invitems[name] = "weapon" print(invitems[name]) -- 输出weapon print(invitems.name) -- 输出nil print(invitems[string.lower(name)]) -- 输出weapon
- 执行
invitems[name] = "weapon"时,方括号取name的计算结果"knife"作为键,实际是给invitems["knife"]赋值 print(invitems[name])取name的值"knife"作为键,所以输出weaponinvitems.name等价于invitems["name"],你未给这个键赋值,所以返回nilinvitems[string.lower(name)]会先执行string.lower(name)得到"knife",再作为键取值,所以输出weapon
内容的提问来源于stack exchange,提问作者ZenPyro
相关产品推荐
相关产品推荐

