如何将字符串键值对存入Lua table并解决表长度为0的问题
问题原因
你的代码已经成功把键值对存入table了,打印#a得到0是两个核心原因:
string.gmatch捕获到的数字是字符串类型,你实际存入的是a["3"] = "Hello"、a["67"] = "Hi"这类字符串键的键值对,不属于Lua table的数组部分- Lua的
#操作符仅统计从下标1开始、连续无中断的整数键构成的数组部分长度,如果键是字符串、或者整数键不满足从1开始连续的要求,#的返回结果不会统计哈希部分的内容,也不符合你的预期
你可以直接遍历table验证数据已经正常存储:
for k, v in pairs(a) do print(k, v) end
可用解决方案
方案1:统计非数组结构table的总键值对数量
不要用#,改用pairs遍历计数即可:
local newstr = "3 = Hello, 67 = Hi, 2 = Bye" local a = {} for k,v in newstr:gmatch "(%d+)%s*=%s*(%a+)" do a[k] = v end local count = 0 for _ in pairs(a) do count = count + 1 end print(count) -- 输出预期值3
方案2:按提取顺序存入数组结构
如果需要用#获取长度,你可以把提取到的原键值作为元素属性,从1开始按顺序插入数组:
local newstr = "3 = Hello, 67 = Hi, 2 = Bye" local a = {} for k,v in newstr:gmatch "(%d+)%s*=%s*(%a+)" do table.insert(a, { origin_key = tonumber(k), value = v }) end print(#a) -- 输出预期值3 -- 遍历访问 for idx, item in ipairs(a) do print(idx, item.origin_key, item.value) end
内容的提问来源于stack exchange,提问作者Glupschi
相关产品推荐
相关产品推荐

