首先,我是 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())
答案 0 :(得分:0)
Cart:new
和 Item:new
用于创建新对象,因此您可以在类本身而不是实例上调用它们。这意味着传递给这些方法的 self
是那些类。
在这两种方法中,您都创建了一个 object
表以成为新对象,因此您需要在该对象上设置字段,而不是修改类,例如 object.discount = discount
。< /p>