【问题标题】:How to compare 2 functions passed as argument如何比较作为参数传递的 2 个函数
【发布时间】:2016-02-13 21:25:58
【问题描述】:

我的应用程序可以使用以下代码将函数推送到待办事项列表中: 功能测试() 打印(“凑凑”) 结束

todo:pushtask( test )  -- First push
todo:pushtask( test )  -- Second push

在内部,待办事项列表是一个 C 整数表,我在其中推送对传递函数的引用:

int func = luaL_ref(L, LUA_REGISTRYINDEX);

但是如何检测我是否正在推送相同的功能? 根据我的测试,即使推送相同的函数,luaL_ref 返回也会执行不同的引用(比如说 ref #1 和 #2) 如何检查 #1 和 #2 是否引用相同的函数?

谢谢

劳伦特

【问题讨论】:

    标签: lua lua-api


    【解决方案1】:

    功能可以直接比较。要查看您是否具有相同的功能,您需要将其与您已有的其他功能进行比较。

    luaL_ref 不会为您进行比较(也不应该)。

    如果你想这样做,除了luaL_ref(或可能代替)引用之外,你还应该保留一个以推送函数作为键的lua表。然后,您可以在表中查找新函数并确定(以哈希表访问成本而不是列表遍历成本)该函数之前是否已添加。

    【讨论】:

    • 感谢您的回复。但是,所有的 TODO 列表处理都是在 C 中完成的:直接从 C 代码中完成它是一种简单的方法吗?
    • 你可以从C 做到这一点就好了。您只需要将表保存在 lua 中(但可以使用 C 代码对其进行管理)。您可以避免使用该表,并且每次都循环遍历引用表中的每个项目(但我真的不建议这样做)。
    • 不幸的是,我需要循环:一个函数可能只调用一次或多次,具体取决于上下文。此待办事项列表推动事件到达 GUI:对于其中一些,每个实例都是有意义的(数据的到达),有些则不是(请求使用只能一次的新数据更新 GUI)。甚至对于“数据到达”,在某些情况下我们也可以只考虑最后一个(即,当它的窗口在后台时)。
    • 我要做的是创建一个表 [Func]=>ref,在推送之前我将在该表上查找现有参考。因此,函数将始终保持相同的引用。只有引用,在我的小表中循环会很快。
    • 您在运行待办事项列表时需要一个循环。当您添加 到待办事项列表时,您不需要 循环。这就是我的观点。是的,带有功能键的表格是这里的重点(就不会多次将同一个表格添加到列表中而言)......除非这里的问题是如何只保留一个 reference到任何给定的函数,但仍允许将该函数多次添加到列表中?
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2020-11-25
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    相关资源
    最近更新 更多