Menu
CoddyTech

比较对象(<, >)

本课属于 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,就能免费获得两个方向的比较。

challenge icon

挑战

简单

我们来创建一个 Product 类,让它可以根据价格使用 < 和 > 运算符进行比较。这非常适合对购物车中的商品排序,或从列表中找出最便宜的商品等场景。

你需要将代码分成两个文件:

  • Product.lua:定义你的 Product 类,并包含 name 和 price 字段。添加一个 :new(name, price) 构造函数,并实现 __lt 元方法,根据商品价格进行比较。记住,定义 __lt 后,也会自动支持 > 运算符:Lua 会帮你处理好!
  • main.lua:引入 Product 模块,根据输入创建商品实例,并比较它们,判断哪个价格更高或更低。

你会收到 4 个输入:

  1. 第一个商品的名称
  2. 第一个商品的价格
  3. 第二个商品的名称
  4. 第二个商品的价格

在主文件中,使用给定的名称和价格创建两个商品。然后进行三次比较,并将每次比较的结果分别打印在单独一行:

  1. 第一个商品是否比第二个商品便宜?(打印 true 或 false)
  2. 第一个商品是否比第二个商品贵?(打印 true 或 false)
  3. 打印价格较低的商品名称

例如,如果输入是 Apple、2、Laptop 和 999,输出应为:

true
false
Apple

Apple(价格为 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: 打印价格较低的产品名称
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Lua 在线编译器