You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:15:03