Menu
CoddyTech

算术元方法(下)

本课属于 Coddy Lua 学习旅程的“逻辑与流程”单元。第 22 课,共 54 课。

在加法和减法的基础上,你还可以使用 __mul 和 __div 元方法为表定义乘法和除法行为。它们的工作方式与 __add 和 __sub 相同,但会响应 * 和 / 运算符。

当你想缩放表中的值时,__mul 元方法特别有用。例如,向量乘以一个数字(称为标量)时,应该将每个分量都乘以这个数字:

local vector = {x = 3, y = 4}

local meta = {
    __mul = function(a, b)
        local scalar = type(a) == "number" and a or b
        local vec = type(a) == "table" and a or b
        return {x = vec.x * scalar, y = vec.y * scalar}
    end
}

setmetatable(vector, meta)

local scaled = vector * 2
print(scaled.x, scaled.y)  -- 输出:6  8

注意函数如何检查哪个操作数是数字,哪个是表。这样,vector * 2 和 2 * vector 都能正常工作。

__div 元方法在除法中的作用也类似:

local meta = {
    __div = function(a, b)
        return {x = a.x / b, y = a.y / b}
    end
}

setmetatable(vector, meta)

local divided = vector / 2
print(divided.x, divided.y)  -- 输出:1.5  2

这些元方法补全了自定义类型的基本算术运算,让你能完全控制数学运算符对表的作用方式。

challenge icon

挑战

简单

编写一个函数 scaleVector,接收 x、y 和 scalar,并以格式化字符串的形式返回缩放后的向量。

创建一个包含给定坐标的向量表,附加一个包含 __mul 元方法的元表,以支持标量乘法;使用 * 运算符将向量乘以标量,然后返回结果。

逻辑:

  • 创建一个向量表,将键 x 和 y 设置为提供的坐标
  • 创建一个包含 __mul 的元表,用于处理向量与标量之间的乘法
  • __mul 函数应检查哪个操作数是数字,哪个是表
  • 返回一个新表,其中 x = vec.x * scalar,y = vec.y * scalar
  • 使用 setmetatable() 将元表附加到向量表
  • 使用 vector * scalar 将向量乘以标量
  • 以 "x y" 格式的字符串返回结果(x 和 y 的值之间用空格分隔)

参数:

  • x(数字):向量的 x 坐标
  • y(数字):向量的 y 坐标
  • scalar(数字):用于与向量相乘的标量值

返回值:以 "x y" 格式的字符串返回缩放后的向量(字符串)

亲手试试

function scaleVector(x, y, scalar)
    -- 在这里编写代码
end
quiz icon自我测试

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

逻辑与流程中的所有课

自己练习: Lua 在线编译器