for x = 1, 16 do
for y = 1, 16 do
local cntr = Center:new()
cntr.point = {x = 0.5 + x - 1, y = 0.5 + y - 1}
centerLookup[cntr.point] = cntr
table.insert(self.centers, cntr)
end
end
在上面的代码中,centerLookup [point]用于通过输入点位置来查找相应的Center对象。
然而,当我尝试这样做时:
function neighbors(center, sqrtsize)
if center.point.y + 1 < sqrtsize then
local up = {x = center.point.x, y = center.point.y+1}
local centerup = centerLookup[up]
table.insert(center.neighbors, centerup)
end
end
centerup以零值返回
如果问题在于我无法使用表格作为索引,那么这就是我想的。
有人知道这里有什么问题吗?
P.S。如果它有用,中心从0.5开始(所以[0.5,0.5]将是第一个中心,然后是[0.5,1.5]等。)
提前致谢!
答案 0 :(得分:2)
这与局部变量无关,而与表格按引用而非按值进行比较的事实无关。
在Lua中,表是具有自己标识的引用类型。即使两个表具有相同的内容,Lua也不认为它们是相同的,除非它们是完全相同的对象。
为了说明这一点,下面是一些示例代码和打印值:
local tbl1 = {x = 0.5, y = 0.5}
local tbl2 = tbl1
local tbl3 = {x = 0.5, y = 0.5}
print(tbl1 == tbl2) -- True; tbl1 and tbl2 both reference the same table
print(tbl1 == tbl3) -- False; tbl1 and tbl3 reference different tables
local up = {x = center.point.x, y = center.point.y+1}
local centerup = centerLookup[up]
在此代码段中,up
是一个全新的表,只有一个引用(up
变量本身)。即使表格密钥存在相同的内容,这个新表也不会成为centerLookup
表中的密钥。
cntr.point = {x = 0.5 + x - 1, y = 0.5 + y - 1}
centerLookup[cntr.point] = cntr
table.insert(self.centers, cntr)
在此代码段中,您可以创建一个新表格,并在三个不同的位置引用它:cntr.point
,centerLookup
作为键,self.centers
作为值。您可能会遍历self.centers
数组,并使用完全相同的表来查找centerLookup
表中的项目。但是,如果您要使用不在self.centers
数组中的表,则无效。
答案 1 :(得分:2)
上校三十二解释了您的代码无法正常工作的原因。我只想添加快速解决方案:
function pointToKey(point)
return point.x .. "_" .. point.y
end
使用此功能在两个地方进行查找
--setup centerLookup
centerLookup[pointToKey(cntr.point)] = cntr
--find point from lookup
local centerup = centerLookup[pointToKey(up)]