在循环中创建对象表格时出现问题。每个表格项都是最后一个项目!Lua

所以我创建了一个样本程序来说明一个我不能分享的真实程序。

我的示例程序有一个Float对象。Float对象保存整数部分和小数部分。

我有一个循环,将创建10个浮点数并将它们添加到一个数字表中。

当我打印数字表时,每个项目都是最后一个创建的项目。我当然希望每个项目都是自己的。

我觉得这个错误是因为Lua的传递引用模型的对象,而且我必须没有正确设置‘class’。

示例代码:

-- Float类

Float = { int = 0, decimal = 0 }
function Float:new(o, i, d)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    self.int = i
    self.decimal =  d
    return o
end

function Float:print()
    print(self.int.."."..self.decimal)
end
-- Float类结束

-- 驱动程序代码
numbers = {}
function main()

    for i = 0, 10, 1 do
        -- 这种奇怪的索引是因为在我的真实程序中,我将使用字符串索引,所以我想模拟那个
        numbers["a"..i] = Float:new(nil, i, i)
    end

    for k,v in pairs(numbers) do
        print(v:print())
    end

end

main()

输出:

10.10

10.10

10.10

10.10

10.10

10.10

10.10

10.10

10.10

10.10

10.10

预期输出(但顺序不同,因为pairs()函数):

1.1
2.2
3.3
4.4
5.5
6.6
7.7
8.8
9.9
10.10
点赞
用户107090
用户107090

Float:new(nil,i,i) 中的 self 指的是 Float,而不是 o

因此,使用以下方式:

o.int = i
o.decimal =  d

而不是

self.int = i
self.decimal =  d
2018-04-03 01:59:16