lua函数在表格中包含参数
2019-8-29 15:14:14
收藏:0
阅读:88
评论:3
我是lua的新手,想要在一个表格里存储具有在“存储时”给定参数的函数。
尝试了下面的代码,但显然并不是我想要的。
local functable = {}
local function myfunc(x,y)
print(x ,y)
end
table.insert(functable, {func = myfunc})
table.remove(functable).func("hello", "World")
我想在“insert”时存储变量,所以我尝试将参数存储在表格中:
functable = {}
function myfunc()
print(functable[#functable].p1 ,functable[#functable].p2)
end
table.insert(functable, {func = myfunc, p1="Hello", p2="World"})
table.remove(functable).func()
但是这段代码不起作用。
有人能告诉我正确的方向吗?
点赞
用户6834680
这是对 Nifim 的第一个变体的修改:
functable = {}
local function myfunc(x,y)
print(x, y)
end
local F_mt = {}
function F_mt:__call()
return self.func(table.unpack(self.params))
end
local function F(obj)
return setmetatable(obj, F_mt)
end
table.insert(functable, F{func = myfunc, params = {"Goodbye", "World~"}})
table.insert(functable, F{func = myfunc, params = {"Hello", "World!"}})
table.remove(functable)()
table.remove(functable)()
其中,functable 是一个空表。 myfunc(x,y) 是一个打印 x 和 y 的函数。 F_mt 是一个元表,定义了如何调用一个函数对象。 F(obj) 将一个函数对象设置为带有 F_mt 的元表。table.insert 将两个函数对象插入 functable 中。 table.remove(functable)() 将 Remove functable 中的最后一个元素并调用,两次调用 myfunc。
2019-08-29 16:49:31
用户3574628
而不是存储 myfunc 函数,你真正想要存储一个没有参数的类似函数。换句话说,一个闭包:
local functable = {}
local function myfunc(x, y)
print(x, y)
end
local function addArguments(f, ...)
local args = {...}
return function()
return f(table.unpack(args))
end
end
table.insert(functable, addArguments(myfunc, 'Hello', 'World'))
table.remove(functable)()
这种方法与 Egor 的方案不同之处在于,它使用闭包而不是表来捆绑函数和参数。
2019-08-29 21:04:38
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在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 代码?

你的代码问题在于一旦你用
table.remove,你就无法使用functable[#functable]恢复p1和p2。如果你输入第二个函数,你会看到打印输出但打印的参数将是你在表格中下一个函数的参数。table.insert(functable, {func = myfunc, p1="Goodbye", p2="World~"}) table.insert(functable, {func = myfunc, p1="Hello", p2="World!"}) table.remove(functable).func()输出:
我建议的解决方案是在表格中设置参数,然后在调用函数时应用这些参数:
functable = {} local function myfunc(x,y) print(x ,y) end table.insert(functable, {func = myfunc, params = {"Goodbye", "World~"}}) table.insert(functable, {func = myfunc, params = {"Hello", "World!"}}) local action1 = table.remove(functable) local action2 = table.remove(functable) action1.func(table.unpack(action1.params)) action2.func(table.unpack(action2.params))另一种解决方案是包装您的函数并将参数设置为 upvalues。
这是一个示例:
functable = {} function myfunc(...) local params = {...} local function func() print(params[1] ,params[2]) end return func end table.insert(functable, {func = myfunc("Goodbye", "World~")}) table.insert(functable, {func = myfunc("Hello", "World!")}) table.remove(functable).func() table.remove(functable).func()