Lua中如何遍历表值?遍历子表遇‘attempt to call a table value’报错求解
解决Lua子表遍历的报错问题
嘿,这个问题我太熟悉了!你碰到的attempt to call a table value报错,本质是Lua和Python的遍历逻辑不一样——Lua不能像Python那样直接把表丢进for循环里,得用专门的迭代器函数来处理。
为什么会报错?
Lua的for...in语法要求三个核心部分:迭代器函数、状态变量、初始值。你写的for i in a["orszag"] do,Lua会把a["orszag"]这个表当成函数去调用,自然就会触发“试图调用表值”的错误。
两种可行的遍历方式
针对你的子表(都是连续整数索引的数组结构),有两种常用的遍历方法:
1. 用ipairs遍历有序数组
ipairs是Lua专门用来遍历从1开始的连续整数索引表的迭代器,完全匹配你的子表场景:
local a = { orszag = {"Ausztria", "Albánia", "Azerbajdzsán"}, varos = {"Ankara", "Amszterdam", "Antwerpen"}, fiu = {"Arnold", "Andor", "Albert"}, lany = {"Anna", "Anasztázia", "Amanda"} } -- 遍历orszag子表,和用户输入对比 local user_input = "Ausztria" -- 假设这是用户输入的值 for index, value in ipairs(a["orszag"]) do if value == user_input then print("找到匹配项:", value) -- 这里可以添加匹配后的逻辑 break end end
ipairs会从索引1开始,依次遍历到第一个非整数索引或nil的位置,非常适合这种有序的数组型表。
2. 用pairs遍历所有键值对
如果你的子表后续可能出现非连续整数索引(比如自定义键),可以用pairs遍历所有键值对:
for key, value in pairs(a["orszag"]) do print("键:", key, "值:", value) -- 同样可以加入和用户输入对比的逻辑 end
不过你的场景里ipairs更高效也更贴合需求。
和Python的区别小总结
Python里for item in list是直接迭代元素,但Lua的迭代器模式需要显式指定迭代逻辑——这是两种语言语法设计的差异,习惯就好啦!
内容的提问来源于stack exchange,提问作者Erményi György
相关产品推荐
相关产品推荐

