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
相关产品推荐
相关产品推荐

