在 Lua 上将对象添加到数组

Adding objects to array on Lua

首先,我是 lua 的新手,我正在尝试实现一个简单的购物车作为面向对象的练习。

所以我定义了一个购物车对象,它存储了几个项目对象

Cart = {
    items = {},
    discount = 0
}

function Cart:new(discount)
    local object = {}
    setmetatable(object, {__index = self})
    self.discount = discount

    return object
end

function Cart:addItem(item)
    table.insert(self.items, item)
end

function Cart:GetTotal()
    local total = 0
    for i = 1, #self.items do
        total = total + self.items[i]:GetPrice()
    end
    return total - self.discount
end

每个项目都有计算价格的责任:

Item = {
    units = 0,
    pricePerUnit = 5,
    name = ""
}

function Item:new(units, pricePerUnit, name)
    local object = {}
    setmetatable(object, {__index =  self})
    self.units = units
    self.pricePerUnit = pricePerUnit
    self.name = name

    return object
end

function Item:GetPrice()
    return self.units * self.pricePerUnit
end

但是当我创建对象并添加项目时,结果是 60,当我调试脚本时,我发现 table 的所有元素都相同,就好像它们被覆盖了一样,有人可以解释一下吗为什么以及如何解决?提前致谢。

local shoppingCart = Cart:new(0)
shoppingCart:addItem(Item:new(1, 10, "Oranges"))
shoppingCart:addItem(Item:new(1, 15, "lemons"))
shoppingCart:addItem(Item:new(1, 20, "Strawberries"))

print(shoppingCart:GetTotal())

Cart:newItem:new 旨在创建新对象,因此您在 classes 本身而不是实例上调用它们。这意味着传递给这些方法的 self 是那些 classes.

在这两种方法中,您都创建了一个 object table 来成为新对象,因此您需要在该对象上设置字段,而不是修改 class ,例如,object.discount = discount.