Lua:如何验证表格中是否包含特定函数

我正在开发一个模块,它根据传入的参数返回一个充满函数的表格。具体来说,该模块返回一组数据转换规则(函数),这些规则需要根据发送数据的客户来应用到数据集上。

我决定将规则库(业务逻辑)与决定应用哪些规则的代码(配置逻辑)进行解耦。

以下是我编写的单元测试,以验证规则构建器是否基于我的某个场景添加了正确的规则(函数):

ruleBuilder = require("ruleBuilder")
ruleLibrary = require("ruleLibrary")
local rules = ruleBuilder.assembleRules("Customer1231")

assert(rules[1] == ruleLibrary.missingSSNRule)

这是正确的验证方法吗?即使ruleLibrary.missingSSNRule函数通过闭包或参数引用了其他几个函数,这种方法也适用吗?

点赞
用户734069
用户734069

假设ruleBuilder.assembleRules的返回值能够知道将someOtherCoolModule.coolFunction放在它的返回值的0索引中(注意:Lua使用1为起始索引,不要使用0作为索引),那么会起作用。

即使someOtherCoolModule.coolFunction是一个闭包,这也能行吗?

所有的函数在Lua中都是闭包。但是,我假设你的意思是ruleBuilder.assembleRules将使用someOtherCoolModule.coolFunction并在其周围构建一个新的函数。

一个函数等于自己。但是它只等于自己。就像两个表只有在它们是相同的表对象时才相等一样,两个函数只有在它们是相同的函数时才相等。函数不等于同一个函数的不同实例,也不等于任何其他函数。这里有例子

2012-09-20 00:02:07
用户1442917
用户1442917

为了验证一个表是否包含特定的函数,你可以利用 Lua 表中的键可以是任何值(包括函数)这一事实。在你的 assembleRules 代码中,你可以写如下内容:

function assembleRules(...)
  ...
  return {
    [someOtherCoolModule.coolFunction] = someOtherCoolModule.coolFunction,
    [yetAnotherModule.anotherFunction] = yetAnotherModule.anotherFunction,
  }
end

然后稍后可以简单地检查是否存在该键:

local rules = ruleBuilder.assembleRules("somedata")
assert(rules[someOtherCoolModule.coolFunction])
2012-09-20 00:08:36