Lua 对象中定义的 2D 数组使用引用传递

我有以下对象:

local Game = {}
function Game:new(aNumberOfPlayers, aPlayer1, aPlayer2)
    self.NumberOfPlayers = aNumberOfPlayers
    self.Player1 = aPlayer1
    self.Player2 = aPlayer2
    self.Id = HttpService:GenerateGUID(true)
    self.Status = "等待中"
    self.Moves = {}
    self.Position = GetInitialGamePosition()
    return self
end

local Square = {}
function Square:new(x, y, index, color)
    self.X = x
    self.Y = y
    self.Index = index
    self.Color = color
    return self
end

它使用以下函数来初始化Position的 2D 数组

function GetInitialGamePosition()
    local mt = {}   -- 创建矩阵
    for i=1,15 do
        mt[i] = {}
        for j=1,15 do
            mt[i][j] = Square:new(i,j,GetIndexFromRowColumn(i,j),nil)
        end
    end
    return mt
end

问题在于,由于表通过引用传递,2D 数组的每个元素都变成了相同的。换句话说,当我遍历 Position 时,每个元素具有相同的行、列和索引。不确定克服这个问题的最佳方法是什么?

点赞
用户1847592
用户1847592
## 将下面翻译成中文并且保留原本的 markdown 格式

function Square:new(x, y, index, color) local o = {} o.X = x o.Y = y o.Index = index o.Color = color setmetatable(o, self) self.__index = self return o end


```lua
function Square:new(x, y, index, color)
    -- 新建一个变量o的表
    local o = {}
    -- 设置表中的元素
    o.X = x
    o.Y = y
    o.Index = index
    o.Color = color
    -- 将元表设置为self
    setmetatable(o, self)
    -- 定义 __index 元方法,以便在该表中找不到属性时可以从self中查找
    self.__index = self
    -- 返回新建的表
    return o
end

该函数为 Lua 语言中的构造函数,用于创建一个名为 Square 的表对象。在该函数中,使用 local 定义一个局部变量 o ,并使用 {} 创建这个表。接下来,我们向 o 中添加了四个属性分别为 XYIndexColor,并分别将传入的四个参数赋给它们。之后,使用 setmetatable(o, self)o 的元表设置为 self,然后在元表中定义元方法 __index,以便在该表中找不到属性时可以从 self 中查找该属性。最后,返回新创建的 o 表对象。

2020-10-03 23:27:31