lua - 如何获取表中函数期望的参数数量?
问题描述
我在 Lua 表中有函数t
,我了解到我可以t
通过运行以下脚本列出包含的所有函数:
for k, v in pairs(t) do
print(k, v)
end
例如,它将打印:
myfunction1 function: 0x107219805
myfunction2 function: 0x10721c194
myfunction3 function: 0x1071e067c
现在,我想知道是否有可能获得它期望的每个函数的参数数量。所以结果可能如下所示:
myfunction1 function: 0x107219805 arguments: 3
myfunction2 function: 0x10721c194 arguments: 4
myfunction3 function: 0x1071e067c arguments: 5
这在Lua中可能吗?还是使用 C API?
解决方案
对于 Lua 5.2+,请参阅 lhf 的答案。
这是仅适用于 Lua 5.1 的解决方案
(您可以将两种解决方案合二为一)
local function get_numparams_isvararg(func)
-- returns num_param (number), is_vararg (boolean)
local s = string.dump(func)
assert(s:sub(1, 6) == "\27LuaQ\0", "This code works only in Lua 5.1")
local int_size = s:byte(8)
local ptr_size = s:byte(9)
local pos = 14 + ptr_size + (s:byte(7) > 0 and s:byte(13) or s:byte(12 + ptr_size)) + 2 * int_size
return s:byte(pos), s:byte(pos + 1) > 0
end
使用示例:
local function f(a, b, c, ...)
end
local function g()
end
print(get_numparams_isvararg(f)) --> 3 true
print(get_numparams_isvararg(g)) --> 0 false
推荐阅读
- postgresql - PostgreSQL:是否可以对字符串中具有日期时间的部分进行排序
- css - 如何显示 3-4-3 flexbox 表?
- php - 从数组中创建相同键的数组
- python - 无法在 Python 中编码非平方整数
- google-cloud-firestore - Firestore,为什么使用“更新”而不是“设置合并”?
- javascript - 如何在 Laravel 中显示文件上传状态?
- mysql - 在我的情况下,使用 MySQL 工作台将记录插入数据库表时出错
- java - 计算把我难住了
- python-3.x - 如何在 Python 中从包含特定字符串的行开始解析文件
- android - 使用 ADB 连接到我的 android 设备但无法使用 ls 命令,它说权限被拒绝