这个脚本会导致很多闭包吗?如果是,有什么替代方案吗?
2011-7-3 0:14:56
收藏:0
阅读:133
评论:2
我想在 Lua 中实现一个 GUI 消息处理系统,目前它的工作方式如下:
在 c++ 代码中,窗口有窗口过程,就像 Windows API 中一样,我也正在尝试在 Lua 中使用它。
因此,我的窗口携带一个指向表的 luabind::object
,例如:
local action = {
[on_uimsg.MOUSEMOVE] = function (ele, a,b,c)return on_mousemove(b,c) end,
[on_uimsg.MOUSEDOWN] = function (ele, a,b,c) return on_mousedown(ele,b) end,
[on_uimsg.LEAVE] = function (ele, a,b,c) return on_mouseleave(b,c) end,
}
表的键是一个 GUI 消息。Ele 是一个窗口句柄,a 是消息,b 和 c 是参数。
local function on_mousemove(b,c)
ConsoleOut2("mousemove %i %i",b,c);
return 0;
end;
local function on_command(b,c)
ConsoleOut2("mousecmd %i %i",b,c);
return 1;
end;
是一些示例函数。
它们像这样绑定到对象上:
parms.pos_x = 620;
parms.pos_y = 300;
parms.width = 100;
parms.height = 100;
parms.parent = DESKTOP;
parms.name = "Test";
parms.skin = "Default_outline";
parms.class = "BasicStaticText";
local window = hud:addWindow(parms,action);
这一切都在同一个脚本文件中,我只执行它一次(据我所知)当我加载它时。
因此,首先构建表,后来将表绑定到 luabind:::object
上。
然后在 C++ 中调用此对象,如下所示:
if (luabind::type(o)==LUA_TFUNCTION)
{
luabind::call_function<int>(o,handle,a,b,c);
}
else if (luabind::type(o)==LUA_TTABLE)
{
luabind::object call = o[a];
if (luabind::type(call)==LUA_TFUNCTION)
{
luabind::call_function<int>(call,handle,a,b,c);
}
}
因此,每当消息被触发时,都会调用该表并返回一个函数,我想是每次都返回一个函数。 我假设这一点,因为即使我只加载一次脚本文件,当调用 action 对象时,当我在脚本中调试并在那里设置断点时,断点也会被触发。
这是一种处理事物的好方法吗?
原文链接 https://stackoverflow.com/questions/6560127
点赞
stackoverflow用户383277
每次运行构造在“action”中存储表格的代码时,都会创建一个闭包。如果这对你来说是个问题,只需在不可访问的范围内创建本地函数(甚至将它们放在注册表中)并引用它们。例如:
local createActionTable;
do
local function onMouseMove(ele, a,b,c)return on_mousemove(b,c) end
local function onMouseDown(ele, a,b,c) return on_mousedown(ele,b) end
local function onMouseLeave(ele, a,b,c) return on_mouseleave(b,c) end
function createActionTable()
local action = {
[on_uimsg.MOUSEMOVE] = onMouseMove,
[on_uimsg.MOUSEDOWN] = onMouseDown,
[on_uimsg.LEAVE] = onMouseLeave,
}
return action
end
end
2011-07-02 23:32:42
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在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 模式将字符串(嵌套数组)转换为真正的数组?
我猜你的问题是每次访问表格是否会_分配_一个新函数。答案是否定的。
请记住:在 Lua 中,普通的函数定义只是未命名函数创建的特例。以下代码是相同的:
function SomeName() end SomeName = function() end
当 Lua 源文件最初执行时便会创建该函数。就像你使用的表格只会在 Lua 源文件最初执行时创建一次一样。如果你多次执行 Lua 源文件,则会多次创建该表格及其内容。
是的,你的代码会有很多函数。但这有什么问题呢?除非你不断创建函数或执行类似滥用行为,否则就没有所谓的“太多”。Lua 没有
switch
语句,就是因为 Lua 代码通常是这样做的。简而言之:这在 Lua 中是完全正常的。