Lua / 为什么往数组中添加元素会覆盖先前添加的元素?

我正在学习Lua,所以我决定实现一个函数,它从数组中取出坐标并输出ASCII图像。

只要我不在同一行(坐标)中放置多个点,就一切顺利:

它会输出

...X
.X..
..X.
...X

而不是

XXXX
.X..
..X.
...X

经过一番调查,我得出了结论:所有局部函数的表现都不错,除了create_massive()。当它放置一个点时,先前在相同的y轴上添加的点被移除了。


为了澄清,这是我得出结论的过程:

我只是去掉了函数create_massive(),并定义了它的数组drawing

local n=nil

drawing={
    {1,1,1,1},
    {n,1,n,n},
    {n,n,1,n},
    {n,n,n,1},
}

然后程序输出了我想要的结果。


完整代码

我可以只留下函数create_massive(),因为只有它需要被修复,但我认为完整的代码会更有帮助:

function draw(coords,sym,spc)

local sym = sym or "X" -- 点
local spc = spc or "-" -- 空格

local max={} -- 包含最大坐标的数组
local min={} -- 包含最小坐标的数组
local drawing={} -- 包含绘图的数组

local function find_min_max()
    -- 找到最小/最大坐标

    for i=1,#coords do
        local c=coords[i]

        if i%2~=0 then
            max.x=max.x and ((c>max.x) and c or max.x) or c
            min.x=min.x and ((c<min.x) and c or min.x) or c
        else
            max.y=min.y and ((c>max.y) and c or max.y) or c
            min.y=min.y and ((c<min.y) and c or min.y) or c
        end
    end

end

local function create_massive()
    -- 创建包含绘图的数组

    for i=2,#coords,2 do
        local y=coords[i]
        local x=coords[i-1]
        drawing[y]={[x]=1} -- 问题在于,它覆盖了以前的点的位置,所以这条线只能包含最后调用的点
    end

end

local function print_drawing()

    local n=1
    local line={}

    for i=min.y,max.y do
        if drawing[i] then
            for k=min.x,max.x do
                if drawing[i][k] then
                    line[n]=line[n] and line[n]..sym or sym
                else
                    line[n]=line[n] and line[n]..spc or spc
                end
                if k==max.x then
                    n=n+1
                end
            end
        else
            for p=min.x,max.x do
                line[n]=line[n] and line[n]..spc or spc
            end
            n=n+1
        end
    end

    for i=1,#line do
        print(line[i])
    end

end

find_min_max()
create_massive() -- 可能这个函数的工作不正确
print_drawing()

end

m={1,1,2,1,3,1,4,1,2,2,3,3,4,4} -- 坐标:数组的偶数索引是y,其他的是x

draw(m) -- 调用主函数
点赞
用户107090
用户107090

drawing[y]={[x]=1} 会创建一个只有一个元素的新行。

尝试使用 drawing[y][x]=1

2018-08-01 08:07:16