我可以在for循环中声明一个局部变量吗?

时间:2017-04-08 20:27:41

标签: for-loop indexing graph lua grid

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]等。)

提前致谢!

2 个答案:

答案 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.pointcenterLookup作为键,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)]