有没有办法迭代用户数据,如对和ipairs做表?

时间:2017-04-28 21:44:17

标签: lua

是否有迭代userdata值条目的函数?我试图在某个userdata变量中列出每个字段及其值,就像pairs一样:

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

pairs不适用于userdata,所以有解决方法吗?

1 个答案:

答案 0 :(得分:3)

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

毕竟,userdata实际上并不包含任何内容(至少就Lua而言)。它的所有Lua功能都来自它提供的元方法。 data.val仅适用,因为userdata具有可以接受字符串__index的{​​{1}}元方法。迭代也不例外;如果userdata没有提供它,你就不能这样做。

在早期版本的Lua中,您可以使用5.2+版本的功能替换现有的"val"pairs函数:查找元方法并在它们可用时使用它们。当然,这只能从C完成,因为只有C代码才能获得用户数据的元表。