lua - Lua 3d 表缺乏对象持久性(键值与表数据不一致)
问题描述
所以我在使用 Lua 时遇到了一个奇怪的问题,我使用以下函数来设置、读取和写入名为 Cube 的全局 3D“数组”。但是似乎每次我在读取或写入这个“数组”时,数据只存储在函数使用的实例上,尽管 Cube 是一个全局变量,不能说我以前遇到过这个,很奇怪.
-- stole this one from: https://stackoverflow.com/questions/27976526/using-a-coordinate-pair-as-a-key-in-a-lua-table
-- basically the intended use is to store a 2d table of block information for the level the turtle is on
function setUpLevel()
local test = {_props = {}}
local mt = {}
local function coord2index(x, z)
return ((x-1) * xMax) + z
end
mt.__index = function(s, k)
if s._props[coord2index(k[1], k[2])] ~= nil then
return s._props[coord2index(k[1], k[2])]
end
end
mt.__newindex = function(s, k, v)
s._props[coord2index(k[1], k[2])] = v
end
mt.__call = function (t, k)
if type(k) == "table" then print "Table" end
end
setmetatable(test, mt)
return test
--test[{1,2}] = 5
end
function setupCube()
local cube = {}
cube[relY]=setUpLevel()
return cube
end
Cube = setupCube()
function readCubeData(x,y,z)
if (Cube[y]==nil) then
return nil
end
-- debug
return Cube[y][{x,z}]
end
function storeCubeData(x,y,z,data)
if (readCubeData(x,y,z)==nil) then
Cube[y]=setUpLevel()
end
Cube[y][{x,z}]=data
data= readCubeData(x,y,z)
print (x,",",y,",",z,":",readCubeData(x,y,z))
sleep(.5)
end
输出示例:
中的打印语句storeCubeData()
将提供正确的输出(顺序无关紧要,只是与 x、y、z 值对应的数据)
但是,以下打印语句start()
function start()
detectAndStore()
print("=============")
sleep(1)
data= readCubeData(0,relY,1)
print (0,",",relY,",",1,":",readCubeData(0,relY,1))
sleep(.5)
data= readCubeData(-1,relY,0)
print (-1,",",relY,",",0,":",readCubeData(-1,relY,0))
sleep(.5)
data= readCubeData(0,y,-1)
print (0,",",relY,",",-1,":",readCubeData(0,relY,-1))
sleep(.5)
data= readCubeData(1,y,0)
print (1,",",relY,",",0,":",readCubeData(1,relY,0))
sleep(.5)
end
start()
这只是悲惨地不正确,x,y,z 值不指向正确的值,并且表也不意味着在相同的 x,y,z 位置重复。我真的无法为我的生活弄清楚这一点
解决方案
错误if (readCubeData(x,y,z)==nil) then
在storeCubeData(x,y,z,data)
. 每次尝试在其中存储新信息时,都会覆盖整个“级别”。应该是if (Cube [y] == nil) then
。整个if
语句可以进一步简化为Cube [y] = Cube [y] or setUpLevel ()
。
另外,if s._props[coord2index(k[1], k[2])] ~= nil then
不是必须的;并且函数可以定义为局部的;并且散列函数coord2index
将导致冲突(例如coord2index (1, 5) == coord2index (2, -5)
, if xMax == 10
),因此将其替换为@Egor Skriptunoff 所说。
推荐阅读
- django - 在 django 中获取 url
- c - `function-definition` 是 `declaration` 吗?
- loops - Lua,如何通过释放按钮来停止“重复”?
- c++ - 从 dll 导出的函数的 stdint 标头
- react-native - 在我的反应原生应用程序中获取用户的虚拟支付地址
- android - Xamarin Android TabbedPage 在选项卡上显示 FontAwesome 图标
- android - 通知生成器位图图标因太大而导致 android 模拟器崩溃
- linux - curl: (7) 无法完成与 0.0.0.0.0:6677 的 SOCKS5 连接。(8)
- c - 显示程序退出状态?
- database - 在已经创建该表之后,如何更改 HANA DB 中的列以递增?