将对象添加到 Lua 上的数组

时间:2021-07-17 00:46:18

标签: 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,当我调试脚本时,我发现表的所有元素都相同,就好像它们被覆盖一样,有人可以向我解释为什么以及如何得到解决?提前致谢。

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())

1 个答案:

答案 0 :(得分:0)

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

在这两种方法中,您都创建了一个 object 表以成为新对象,因此您需要在该对象上设置字段,而不是修改类,例如 object.discount = discount。< /p>

相关问题