Lua 中是否有一种函数,能够输入一个函数,然后返回该函数的名称字符串?
抱歉,如果这个问题太简单了,但我是 Lua 的新手,而且我在参考文献中找不到它。
Lua 中是否有一个 NAME_OF_FUNCTION 函数,可以给定一个函数并返回它的名称,以便我可以使用它在一个表中进行索引?我想要这样做的原因是我想做这样的事情:
local M = {}
local function export(...)
for x in ...
M[NAME_OF_FUNCTION(x)] = x
end
end
local function fun1(...)
...
end
local function fun2(...)
...
end
.
.
.
export(fun1, fun2, ...)
return M
原文链接 https://stackoverflow.com/questions/7886757
如果我没错的话(但实际上我从未在 Lua 中编程,只是阅读过很多论文和文章),内部已经有一个带有函数名称的表(类似于 Python 中的 locals
和 globals
),因此您应该能够执行反向查找以查看哪个键与函数引用匹配。
无论如何,这只是猜测。
但事实是,查看您的代码,您已经知道函数的名称,因此可以自由构造表格。如果您想要减少出错的可能性,最好使用函数名称来获取函数引用(使用 eval
或类似的东西)而不是相反。
无法获取函数名称
没有这样的函数。我猜不存在这样的函数,因为函数是一等公民。因此,NAME_OF_FUNCTION
函数并不是很有用,因为同一个函数可以由许多变量引用,也可能没有变量引用它。
你可以模拟全局函数或在表中的函数,通过循环遍历表(任意表或_G表),检查值是否等于x。如果是的话,那么就找到了这个函数的名称。
a=function() print"fun a" end
b=function() print"fun b" end
t={
a=a,
c=b
}
function NameOfFunctionIn(fun,t) --返回fun指向的表t中的函数名称
for k,v in pairs(t) do
if v==fun then return k end
end
end
print(NameOfFunctionIn(a,t)) -- 在t中打印a
print(NameOfFunctionIn(b,t)) -- 在t中打印c
print(NameOfFunctionIn(b,_G)) -- 在全局表中打印b,因为全局表中的b就是b。其实这里有点没什么用。
另一种方法是将函数包装在一个表中,并设置一个元表来调用该函数,如下所示:
fun1={
fun=function(self,...)
print("Hello from "..self.name)
print("Arguments received:")
for k,v in pairs{...} do print(k,v) end
end,
name="fun1"
}
fun_mt={
__call=function(t,...)
t.fun(t,...)
end,
__tostring=function(t)
return t.name
end
}
setmetatable(fun1,fun_mt)
fun1('foo')
print(fun1) --或print(tostring(fun1))
这将比使用裸函数慢一些,因为需要元表查找。这也无法防止任何人改变函数在状态中的名称,改变包含它的表中的函数名称,改变函数本身等等,因此不是不可篡改的。你还可以像 fun1.fun
一样只通过索引访问表,这在将其导出为模块时可能会很好,但会导致元表失去名称和其他技巧。
技术上讲,这是可能的,这里是export()函数的一个实现:
function export(...) local env = getfenv(2); local funcs = {...}; for i=1, select("#", ...) do local func = funcs[i]; for local_index = 1, math.huge do local local_name, local_value = debug.getlocal(2, local_index); if not local_name then break; end if local_value == func then env[local_name] = local_value; break; end end end return env; end
```
它使用了debug API,需要对Lua 5.2进行一些更改,最后我并不一定认为它是编写模块的好方法,我只是简单地回答问题。
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
请尝试这个链接:
http://pgl.yoyo.org/luai/i/tostring
tostring( x )
应该是你要寻找的功能。