Lua中向数组添加对象

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

所以我定义了一个存储多个物品对象的Cart对象

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, "橘子"))
shoppingCart:addItem(Item:new(1, 15, "柠檬"))
shoppingCart:addItem(Item:new(1, 20, "草莓"))

print(shoppingCart:GetTotal())
点赞
用户3574628
用户3574628

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

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

`Cart:new`和`Item:new`旨在创建新对象,因此您将它们调用在类本身而不是实例中。这意味着传递给这些方法的`self`是这些类。

在这两种方法中,您需要创建一个`object`表来成为新对象,因此需要在该对象上设置字段,而不是修改类,例如`object.discount = discount`。 
2021-07-17 01:22:14