Menu
CoddyTech

对象相减

本课属于 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 会直接调用这个元方法,并将两个操作数都作为参数传入。

challenge icon

挑战

简单

我们来创建一个支持使用 - 运算符进行减法的 Color 类。颜色由 RGB 值表示,一个颜色减去另一个颜色会生成一个新颜色,其各个分量分别是对应分量的差值。

你需要将代码分写在两个文件中:

  • Color.lua:定义 Color 类,其中 r、g 和 b 分量分别表示红色、绿色和蓝色的值。添加 :new(r, g, b) 构造函数,并实现 __sub 元方法,使两个颜色相减时生成一个各分量分别为差值的新颜色。记住,__sub 使用点语法,并接收两个操作数作为参数。
  • main.lua:引入 Color 模块,根据给定的输入创建颜色实例,将它们相减,并显示结果的 RGB 值。

你会收到 6 个输入值:

  1. 第一个颜色的红色分量
  2. 第一个颜色的绿色分量
  3. 第一个颜色的蓝色分量
  4. 第二个颜色的红色分量
  5. 第二个颜色的绿色分量
  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 值分别打印在单独的行上
quiz icon自我测试

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

面向对象编程中的所有课

自己练习: Lua 在线编译器