2017-04-08 147 views
1
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對象。我可以在for循環中聲明局部變量嗎?

然而,當我嘗試這樣做:

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收益爲空值

IDK如果問題是,我不能用一個表作爲索引,但這是我在想什麼。

有人知道這裏有什麼問題嗎?

P.S.如果有幫助的話,中心開始爲0.5(所以[0.5,0.5]將是第一個中心,然後是[0.5,1.5]等)

在此先感謝!

回答

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是隻有一個參考全新表(變量本身)。即使表格鍵存在相同的內容,此新表格也不會成爲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陣列中的表格,它將不起作用。

+0

感謝在深入的解釋,這正是我一直在試圖找出 – Denfeet

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)] 
+0

是的,烏爾實現工作。謝謝! – Denfeet

相關問題