__tostring 元方法
本课属于 Coddy Lua 学习旅程的“逻辑与流程”单元。第 20 课,共 54 课。
在 Lua 中打印表时,你通常会看到类似 table: 0x5f8a20 这样没什么用的信息,它只是一个内存地址。通过定义表转换为字符串时要显示的内容,__tostring 元方法可以让你改变这种行为。
这个元方法对于调试和生成更整洁的输出特别有用。当 Lua 需要将你的表转换为字符串时(例如使用 print() 时),它会检查这个表是否有一个包含 __tostring 字段的元表。如果有,Lua 就会调用该函数,并使用它的返回值,而不是默认表示形式。
下面介绍如何实现:
local vector = {x = 3, y = 4}
local meta = {
__tostring = function(t)
return "Vector(" .. t.x .. ", " .. t.y .. ")"
end
}
setmetatable(vector, meta)
print(vector) -- 输出:Vector(3, 4)__tostring 函数接收表作为参数,并且必须返回一个字符串。在这个示例中,它会构造一个格式化字符串,以易读的格式显示向量的 x 和 y 值。
这样一来,代码会更容易处理。调试时,你不必再看到难以理解的内存地址,而是能获取表中内容的有用信息。
挑战
简单编写一个函数 createPoint,接收 x 和 y 坐标,并返回一个具有自定义字符串表示形式的点表。
创建一个包含 x 和 y 字段的表,为其附加一个包含 __tostring 元方法的元表,并返回使用 tostring() 将该表转换为字符串的结果。
逻辑:
- 创建一个表,将键
x和y的值设为提供的坐标 - 创建一个包含
__tostring的元表,使其返回格式为"Point(x, y)"的字符串 - 使用
setmetatable()将元表附加到点表 - 返回
tostring(point),以获取自定义字符串表示形式
参数:
x(数字):点的 x 坐标y(数字):点的 y 坐标
返回值:点的自定义字符串表示形式,格式为 "Point(x, y)"(字符串)
亲手试试
function createPoint(x, y)
-- 在这里编写代码
end
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Lua 在线编译器