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

Lua报错attempt to call global 'winners'(table值)及数组匹配逻辑求助

嘿,我来帮你搞定这个Lua的问题~咱们一步步来解决:

首先,修复调用错误

你最后一行的代码写错啦!winners是你定义的表,不是函数,你应该调用自己写的win函数,而且你的win函数现在没返回值,得补上。这就是你报错attempt to call global 'winners' (a table value)的原因。

然后,完善匹配逻辑

原代码的嵌套循环有个致命问题:比如当找到某个获奖者在班级里时,后面的循环会把res[i]重新设为0——只要有一个不匹配的元素,就会覆盖之前的1,完全不符合你的需求。

另外,嵌套循环的效率也不高,咱们可以换个更聪明的思路:先把classMates转成一个哈希表(键是同学名字,值设为true),这样判断某个名字是否存在时,直接查哈希表就行,不用再循环,效率快很多。

修正后的完整代码

function win(classMates, winners)
    local res = {}
    -- 把班级名单转成哈希表,用于快速查找
    local classLookup = {}
    for _, name in ipairs(classMates) do
        classLookup[name] = true
    end
    -- 逐个检查获奖者是否在班级名单中
    for i, winnerName in ipairs(winners) do
        -- 存在则设为1,不存在设为0
        res[i] = classLookup[winnerName] and 1 or 0
    end
    -- 记得返回结果数组
    return res
end

-- 定义你的两个表
local classMates = {"frank", "alex", "soli"}
local winners = {"lora", "frank", "sandra", "alex"}

-- 调用函数并获取结果
local finalResult = win(classMates, winners)

-- 打印结果
for _, val in ipairs(finalResult) do
    print(val)
end

代码说明

  • 哈希表优化:把班级名单转成键值对后,查找某个名字是否存在的时间复杂度从O(n)变成了O(1),班级人数越多,这个优势越明显。
  • 逻辑修正:用classLookup[winnerName] and 1 or 0的写法,只要找到匹配就设为1,不会被后续不匹配的元素覆盖。
  • 局部变量:把res和classLookup都声明成局部变量,这是Lua的最佳实践,避免污染全局环境。

测试结果

运行这段代码,会输出:

0
1
0
1

完美符合你的需求:lora不在班级里→0,frank在→1,sandra不在→0,alex在→1。

内容的提问来源于stack exchange,提问作者Nicholas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:42:55