Lua中如何通过函数生成任意数量的if判断条件实现代码复用?
Lua动态条件判断实现方案
你提到的需求完全可行,以下是两种对应实现方案:
方案1:动态字符串生成可执行条件
如果需要从其他函数生成字符串作为判断条件,可以使用Lua内置的load()(5.1版本用loadstring())函数将字符串转为可执行的校验函数,实现任意规则的动态拼接:
-- 1. 可从其他函数动态生成额外条件字符串表 local extraConditions = { "item.uicategory == 50", "item.uicategory == 1" } -- 2. 拼接完整条件字符串 local baseCondition = "(item.type >= startbag and item.type <= endbag) and not item.isuntradeable and item.equipslot ~= 0 and item.ishq" if #extraConditions > 0 then baseCondition = baseCondition .. " and (" .. table.concat(extraConditions, " or ") .. ")" end -- 3. 生成校验函数 local checkItemValid = load("return function(item, startbag, endbag) return " .. baseCondition .. " end")() -- 4. 复用原逻辑 if checkItemValid(item, startbag, endbag) then gFatCat.count.goodies = gFatCat.count.goodies + 1 gFatCat.item.goodies[gFatCat.count.goodies] = item ml_debug(string.format("[FatCat] - #% 3d - Count: %3d - Name: %s Bag: %d Slot: %d", gFatCat.count.goodies, item.count, item.name, item.type, item.slot)) end
注意:该方案存在代码注入风险,如果规则来自用户输入等不可信来源,需要提前做内容校验,禁止执行恶意代码。
方案2:条件校验表(生产环境更推荐)
如果规则是可枚举的自定义规则,更推荐用函数集合实现动态条件,无注入风险、性能更高、调试更方便:
-- 1. 定义校验规则集合,支持动态增删规则 local itemCheckRules = { function(item) return item.type >= startbag and item.type <= endbag end, function(item) return not item.isuntradeable end, function(item) return item.equipslot ~= 0 end, function(item) return item.ishq end, -- 新增规则直接插入即可,也可从其他函数动态写入 function(item) return item.uicategory == 50 or item.uicategory == 1 end } -- 2. 通用校验函数 local function isItemPassCheck(item) for _, checkFunc in ipairs(itemCheckRules) do if not checkFunc(item) then return false end end return true end -- 3. 复用原逻辑 if isItemPassCheck(item) then gFatCat.count.goodies = gFatCat.count.goodies + 1 gFatCat.item.goodies[gFatCat.count.goodies] = item ml_debug(string.format("[FatCat] - #% 3d - Count: %3d - Name: %s Bag: %d Slot: %d", gFatCat.count.goodies, item.count, item.name, item.type, item.slot)) end
内容的提问来源于stack exchange,提问作者FatCat
相关产品推荐
相关产品推荐

