是否有迭代userdata值条目的函数?我试图在某个userdata变量中列出每个字段及其值,就像pairs
一样:
local function list_entries ( obj )
for k, v in pairs ( obj ) do
print ( k .. ": " .. tostring ( v ) )
end
end
pairs
不适用于userdata,所以有解决方法吗?
答案 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代码才能获得用户数据的元表。