我最近在 lua 中了解到 methatables 的存在,我一直在玩弄它们,直到我想到一个想法:是否可以使用它们来尝试避免表中的“重复”?我搜索和搜索,到目前为止找不到我要找的东西,所以我在这里。
- 所以这就是我想要做的,以及目的:
它将用于 WoW 插件编程。我想制作一个在全局范围内创建变量或函数时会提示警告的工具(避免使用它,因为可能与其他插件发生命名冲突)。我想从那里做的另一件事是将所有传输重定向到 _G 表。因此,当用户在全局范围内创建变量或函数时,该工具会捕获它,将其存储在表中而不是 _G 中,并且每当用户尝试从 _G 访问某些内容时,该工具会首先在所说的桌子; 并仅使用 _G 作为后备。这样,用户就不必担心适当的封装或命名,该工具会为他处理一切。
- 我已经设法做到了:
我在 _G 上设置了一个 __newindex 元方法来捕获全局范围的变量和函数,并在插件加载结束时删除元方法,以避免它被其他插件使用。对于“_G 传输的间接”,我已经知道如何在尝试使用 _G 之前使用 __index 来尝试给出存储在另一个表中的值。
- 我遇到的问题:
这很好用,但仅适用于 _G 中尚不存在的变量和函数。每当为 _G 表中已经存在的键分配值时,它都不起作用(原因很明显)。我确实希望能够捕捉到这些情况,并且基本上不可能真正覆盖_G的内容,而是使用一种“重载”(但用户甚至不必知道这一点)。
- 我尝试了什么:
我试图挂钩 rawset,看看它是否被自动调用,但似乎不是。
我无法在 lua 中找到很多关于 _G 表的文档,主要是因为名称短。我确定某处一定存在某些东西,我可能可以使用这些信息以我想要的方式完成事情,但目前我只是有点迷失并且没有想法。所以,是的,我想知道是否有任何方法可以“捕获”所有“对 rawset 的隐式调用”,以便在让它执行操作之前进行一些检查。我收集到显然没有 __existingindex 或其他东西的元方法,所以你知道有什么方法吗?