算术元方法(下)
本课属于 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这些元方法补全了自定义类型的基本算术运算,让你能完全控制数学运算符对表的作用方式。
挑战
简单编写一个函数 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
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Lua 在线编译器