使用函数名称的字符串调用Lua函数。
2009-11-24 16:31:1
收藏:0
阅读:278
评论:5
在Lua中,是否可以根据表示其名称的字符串执行函数?
也就是说,如果有字符串 x = "foo"
,是否可以执行 x()
?
如果可以,语法是什么?
原文链接 https://stackoverflow.com/questions/1791234
点赞
stackoverflow用户10601
听起来你想要执行一个'eval',在Lua中可以这样实现:
assert(loadstring(x))()
不过你可能需要先将“()”与x连接起来。
2009-11-24 16:35:51
stackoverflow用户41661
loadstring
在这里不是答案。首先,您需要在字符串中使用 return
,还有其他细节我不会深入探讨。
THC4k 的想法是正确的;如果您将函数名称存储在变量 x 中,则所需的调用是
_G[x](arg1, arg2, ...)
2009-11-24 16:55:35
stackoverflow用户173806
调用全局命名空间中的函数(如 @THC4k 所述)很容易实现,不需要使用 loadstring()
。
x='foo'
_G[x]() -- 从全局命名空间调用 foo
如果函数在其他 table 中,例如 x='math.sqrt'
,则需要使用 loadstring()
(或遍历每个 table)。
如果使用 loadstring()
,则需要在括号中加上省略号 (...)
以允许参数,还要在开头添加 return
。
x='math.sqrt'
print(assert(loadstring('return '..x..'(...)'))(25)) --> 5
或者遍历表:
function findfunction(x)
assert(type(x) == "string")
local f=_G
for v in x:gmatch("[^%.]+") do
if type(f) ~= "table" then
return nil, "looking for '"..v.."' expected table, not "..type(f)
end
f=f[v]
end
if type(f) == "function" then
return f
else
return nil, "expected function, not "..type(f)
end
end
x='math.sqrt'
print(assert(findfunction(x))(121)) -->11
2009-11-24 17:09:26
stackoverflow用户594745
我经常将一堆函数放在一个表格中:
functions = {
f1 = function(arg) print("函数一:"..arg) end,
f2 = function(arg) print("函数二:"..arg..arg) end,
...,
fn = function(arg) print("函数 N:argh") end,
}
然后,您可以将字符串用作表索引,并像这样运行函数
print(functions["f1"]("blabla"))
print(functions["f2"]("blabla"))
这是结果:
函数一:blabla
函数二:blablablabla
我认为这比使用 loadstring()
更清晰。如果您不想创建一个特殊的函数表格,可以使用 _G['foo']
。
2011-01-29 06:07:16
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在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 模式将字符串(嵌套数组)转换为真正的数组?
Names are not unique, there can be many functions names `foo` in different namespaces. But `_G['foo']` is `foo` in the global namespace.
变量名不是唯一的,不同的命名空间中可能会有许多名为
foo
的函数。但是_G['foo']
是全局命名空间中的foo
。