有没有一种方法可以迭代userdata,就像pairs和ipairs与表格一样?

有没有一种函数可以迭代userdata值中的条目? 我正在尝试列出一些userdata变量中的每个字段及其值,就像'pairs'所做的那样:

local function list_entries ( obj )
    for k, v in pairs ( obj ) do
        print ( k .. ": " .. tostring ( v ) )
    end
end

userdata不适用于'pairs',因此有没有解决方法?

点赞
用户734069
用户734069

Lua 5.2+ 提供了 __pairs__ipairs 元方法。如果一个 userdata 提供了它们,那么相应的 Lua 迭代器会调用它们来获取迭代数据。这意味着 userdata 必须明确选择提供迭代支持;它不能被 强制 提供。

毕竟,userdata 实际上并不包含任何东西(至少在 Lua 中是这样的)。它的所有 Lua 功能都是通过它提供的元方法实现的。data.val 之所以起作用,是因为 userdata 有一个可以处理字符串 "val"__index 元方法。迭代也不例外;如果 userdata 没有提供它,你就无法进行迭代。

在早期版本的 Lua 中,你可以用与 5.2+ 版本相同的功能替换现有的 pairsipairs 函数:查找元方法并在它们可用时使用它们。当然,这只能在 C 代码中完成,因为只有 C 代码可以获取 userdata 的元表。

2017-04-28 21:48:54