Menu
CoddyTech

__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 值。

这样一来,代码会更容易处理。调试时,你不必再看到难以理解的内存地址,而是能获取表中内容的有用信息。

challenge icon

挑战

简单

编写一个函数 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
quiz icon自我测试

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

逻辑与流程中的所有课

自己练习: Lua 在线编译器