比较对象(<, >)
本课属于 Coddy Lua 学习旅程的“面向对象编程”单元。第 29 课,共 70 课。
除了算术运算和拼接,你还可以使用比较元方法来定义对象之间的比较方式。__lt 元方法用于处理“小于”(<)运算符。
当 Lua 计算 a < b 时,会在元表中查找 __lt。这个元方法应根据你的比较逻辑返回 true 或 false。
local Item = {}
Item.__index = Item
function Item:new(name, price)
local obj = {name = name, price = price}
setmetatable(obj, Item)
return obj
end
function Item.__lt(a, b)
return a.price < b.price
end定义了 __lt 后,你现在可以直接比较项目:
local apple = Item:new("Apple", 2)
local laptop = Item:new("Laptop", 999)
print(apple < laptop) -- 输出:true
print(laptop < apple) -- 输出:false巧妙之处在于:Lua 会根据 > 自动推导出 __lt 运算符。编写 a > b 时,Lua 实际上会改为计算 b < a。因此,只需定义 __lt,就能免费获得两个方向的比较。
挑战
简单我们来创建一个 Product 类,让它可以根据价格使用 < 和 > 运算符进行比较。这非常适合对购物车中的商品排序,或从列表中找出最便宜的商品等场景。
你需要将代码分成两个文件:
Product.lua:定义你的 Product 类,并包含name和price字段。添加一个:new(name, price)构造函数,并实现__lt元方法,根据商品价格进行比较。记住,定义__lt后,也会自动支持>运算符:Lua 会帮你处理好!main.lua:引入 Product 模块,根据输入创建商品实例,并比较它们,判断哪个价格更高或更低。
你会收到 4 个输入:
- 第一个商品的名称
- 第一个商品的价格
- 第二个商品的名称
- 第二个商品的价格
在主文件中,使用给定的名称和价格创建两个商品。然后进行三次比较,并将每次比较的结果分别打印在单独一行:
- 第一个商品是否比第二个商品便宜?(打印
true或false) - 第一个商品是否比第二个商品贵?(打印
true或false) - 打印价格较低的商品名称
例如,如果输入是 Apple、2、Laptop 和 999,输出应为:
true
false
AppleApple(价格为 2)比 Laptop(价格为 999)便宜,因此第一次比较的结果是 true。Apple 并不比 Laptop 贵,因此第二次比较的结果是 false。由于 Apple 的价格更低,它会作为价格较低的商品被打印出来。
亲手试试
-- 加载 Product 模块
local Product = require('Product')
-- 读取输入
local name1 = io.read()
local price1 = tonumber(io.read())
local name2 = io.read()
local price2 = tonumber(io.read())
-- TODO: 使用 Product:new() 创建两个 Product 实例
-- TODO: 使用 < 运算符比较产品,并打印 true/false
-- TODO: 使用 > 运算符比较产品,并打印 true/false
-- TODO: 打印价格较低的产品名称
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Lua 在线编译器