对象相减
本课属于 Coddy Lua 学习旅程的“面向对象编程”单元。第 27 课,共 70 课。
就像 __add 处理 + 运算符一样,__sub 元方法定义了 - 运算符的行为。模式完全相同。你定义一个接收两个操作数并返回一个新对象的函数。
local Color = {}
Color.__index = Color
function Color:new(r, g, b)
local obj = {r = r, g = g, b = b}
setmetatable(obj, Color)
return obj
end
function Color.__sub(c1, c2)
return Color:new(c1.r - c2.r, c1.g - c2.g, c1.b - c2.b)
end处理 RGB 颜色时,减法可能会产生负值。在实际应用中,你可能需要将结果限制在有效范围(0-255)内,但核心元方法结构保持不变。
local bright = Color:new(200, 150, 100)
local dim = Color:new(50, 30, 20)
local result = bright - dim
print(result.r, result.g, result.b) -- 输出:150 120 80记住:定义 __sub 时要用点号(不要用冒号),因为 Lua 会直接调用这个元方法,并将两个操作数都作为参数传入。
挑战
简单我们来创建一个支持使用 - 运算符进行减法的 Color 类。颜色由 RGB 值表示,一个颜色减去另一个颜色会生成一个新颜色,其各个分量分别是对应分量的差值。
你需要将代码分写在两个文件中:
Color.lua:定义Color类,其中r、g和b分量分别表示红色、绿色和蓝色的值。添加:new(r, g, b)构造函数,并实现__sub元方法,使两个颜色相减时生成一个各分量分别为差值的新颜色。记住,__sub使用点语法,并接收两个操作数作为参数。main.lua:引入Color模块,根据给定的输入创建颜色实例,将它们相减,并显示结果的 RGB 值。
你会收到 6 个输入值:
- 第一个颜色的红色分量
- 第一个颜色的绿色分量
- 第一个颜色的蓝色分量
- 第二个颜色的红色分量
- 第二个颜色的绿色分量
- 第二个颜色的蓝色分量
在主文件中,根据给定的 RGB 值创建两个颜色,使用 - 运算符让第一个颜色减去第二个颜色,并将结果颜色的 r、g 和 b 值分别打印在单独的行上。
例如,如果输入是 200、150、100、50、30、20,输出应为:
150
120
80第一个颜色(200,150,100)减去第二个颜色(50,30,20),结果是一个新颜色(150,120,80)。
亲手试试
-- 加载 Color 模块
local Color = require('Color')
-- 读取输入值
local r1 = tonumber(io.read())
local g1 = tonumber(io.read())
local b1 = tonumber(io.read())
local r2 = tonumber(io.read())
local g2 = tonumber(io.read())
local b2 = tonumber(io.read())
-- TODO: 用给定的 RGB 值创建两个 Color 实例
-- TODO: 使用 - 运算符从第一个颜色中减去第二个颜色
-- TODO: 将结果颜色的 r、g 和 b 值分别打印在单独的行上
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Lua 在线编译器