Lua表属性使用误区:方向表opposite属性访问返回nil问题
问题原因
你写的代码存在两个核心错误,导致引用关联失效:
- 第一行先给
U/D/R/L四个变量分别赋值了独立的空表,后续第二到第五行又给这四个变量重新赋值了全新的表,相当于直接覆盖了最开始的变量指向,前后创建的表完全是不同的内存对象。 - 你在定义
U的新表时写的opposite = D,引用的是第一行创建的空D表,而不是第三行才赋值的、带name='down'属性的新D表。同理其他方向的opposite、adjacent字段引用的全是最开始创建的空表,这些空表没有任何自定义属性,访问U.opposite.name自然返回nil。
修正实现
你的设计思路完全可行:用表作为方向值,相等判断直接比对内存引用地址,时间复杂度为O(1),性能和数值比对一致,比字符串比对更优,同时支持直接挂载反向、相邻方向等自定义属性,不需要额外做映射查找。
修正逻辑很简单:先把所有方向表创建完成,再给表绑定互相关联的属性,避免提前引用未初始化完成的变量、避免无意义的空表覆盖,修正后代码如下:
-- 第一步:先创建所有方向的基础表,赋值基础属性 U = {name = 'up'} D = {name = 'down'} R = {name = 'right'} L = {name = 'left'} -- 第二步:所有方向表都创建完成后,再绑定反向、相邻方向关联 U.opposite = D U.adjacent = {R, L} D.opposite = U D.adjacent = {R, L} R.opposite = L R.adjacent = {U, D} L.opposite = R L.adjacent = {U, D} -- 测试输出 print(U.opposite.name) -- 输出:down
使用说明
- 设置朝向直接赋值引用即可:
player.direction = U - 判断朝向不需要比对字符串/数值,直接做引用相等判断:
if player.direction == U then,性能最优 - 获取反向直接访问属性:
local reverse_dir = player.direction.opposite - 获取相邻方向直接遍历adjacent字段即可,不需要额外做转换计算。
如果需要统一管理方向常量,避免全局变量污染,可以额外把四个方向收敛到一个表中:
Direction = { UP = U, DOWN = D, RIGHT = R, LEFT = L }
使用时写player.direction = Direction.UP即可,语义更清晰。
内容的提问来源于stack exchange,提问作者gwizardry
相关产品推荐
相关产品推荐

