2017-04-13 1 views
1

나는 나의지도 모듈에서지도라는 루아 테이블 객체를 생성하고,이 기능은 새로운 인스턴스를 생성합니다루아 표 객체가 비어있는 이유는 무엇입니까?

local map = require (*map module location*) 
Island = map:new() 
:
function Map:new (o) 
    o = o or { 
    centers = {}, 
    corners = {}, 
    edges = {} 
    } 
    setmetatable(o, self) 
    self.__index = self 
    return o 
end 

내가 처음 몇 줄이 코드에 넣어 내 섬 모듈

내가 센터, 모서리, 그리고 테이블의 수를 인쇄 할 때, 그들은 모두 0

에 나올 나는 코너에 대한 별도의 모듈이 있습니다) (새로운 및 Edge : 새 (센터) (새)

왜 센터, 모서리 및 가장자리의 길이가 0으로 출력됩니까?

편집 :

function pointToKey(point) 
    return point.x.."_"..point.y  
end 

function Map:generateCenters(centers) 
    local N = math.sqrt(self.SIZE) 
    for xx = 1, N do 
     for yy = 1, N do 
      local cntr = Center:new() 
      cntr.point = {x = 0.5+xx - 1, y = 0.5+yy - 1} 
      centers[pointToKey(cntr.point)] = cntr 
     end 
    end 
    return centers 
end 

는 크기는 항상이 될 것으로 보인다 완벽한 정사각형

+1

'지도 : 새로운()는'빈 테이블을 가리 키 등 키'corners'와 테이블을 리턴합니다. 크기가 0과 다른 이유는 무엇입니까? – GoojajiGreg

+0

'Island.corners'의 요소 수를 확인하기 전에'table.insert (Island.corners, Corner : new())'를하고 있습니까? – GoojajiGreg

+0

@ GoojajiGreg 다시 확인해보세요. 무슨 뜻인지 알게되었으므로 조금 더 깊이 들어 봤습니다. 혼란스러운 점은 미안합니다. – Denfeet

답변

1

입니다 내가 예를 들어 센터 테이블에 입력 (모서리와 모서리가 유사하다) 무엇인가 변수 범위에 문제가있다. 첫째, 새로운 Map의 인스턴스에 반환 된 olocal해야한다 :

function Map:new (o) 
    local o = o or { -- this should be local 
     centers = {}, 
     corners = {}, 
     edges = {} 
    } 
    setmetatable(o, self) 
    self.__index = self 
    return o 
end 

당신이 Map:generateCenters()에 테이블에 대한 포인터를 전달하면 해당 포인터를 반환 할 필요가 없다. 중심이 해당 테이블에 추가되었습니다

function Map:generateCenters(centers) 
    local N = math.sqrt(self.SIZE) 
    for xx = 1, N do 
     for yy = 1, N do 
      local cntr = Center:new() 
      cntr.point = {x = 0.5+xx - 1, y = 0.5+yy - 1} 
      centers[pointToKey(cntr.point)] = cntr -- HERE you're adding to the table passed as an argument 
     end 
    end 
    -- return centers --> NO NEED TO RETURN THIS 
end 

마지막으로, 당신은 할 것 :

local map = require("map") 
local island = map:new() 
map:generateCenters(island.centers) 

을 당신은 키에 해당하는 테이블 값으로 가리키는 테이블에 센터를 넣어 "말 island "이라는 표에 centers이라고하는 메시지가 표시됩니다.

마지막으로는, 참고

local t = island.centers 
print(#t) 

것이다 아직도 출력 테이블 centers의 요소 수 격차 키 (즉, 그들이 0,1,2,3,4 {가지마가 있기 때문에, ..} 대신에 pointToKey() 함수가 반환하는 문자열). centers의 요소를 계산하기 위해, 당신은 할 수 :

local count = 0 
for k,v in pairs(island.centers) do 
    count = count + 1 
end 
print(count) 
+2

'o'는 매개 변수이기 때문에 로컬입니다. – lhf

+0

@lhf 아 물론. 그 점을 지적 해 주셔서 감사합니다. "Programming in Lua"ch.에서. 15 : "매개 변수는 함수 호출에서 주어진 실제 인수로 초기화 된 지역 변수와 정확히 동일하게 작동합니다 매개 변수의 수와 다른 인수를 가진 함수를 호출 할 수 있습니다 Lua는 인수의 개수를 매개 변수의 수로 조정하고, 다중 할당에서와 마찬가지로 : 여분의 인수는 버리고 추가 매개 변수는 무효화됩니다. " – GoojajiGreg

관련 문제