【发布时间】:2021-12-11 18:27:56
【问题描述】:
有人知道将键和值保存到表中的解决方案吗?我的想法行不通,因为表格的长度是 0,应该是 3。
local newstr = "3 = Hello, 67 = Hi, 2 = Bye"
a = {}
for k,v in newstr:gmatch "(%d+)%s*=%s*(%a+)" do
--print(k,v)
a[k] = v
end
print(#a)
【问题讨论】:
有人知道将键和值保存到表中的解决方案吗?我的想法行不通,因为表格的长度是 0,应该是 3。
local newstr = "3 = Hello, 67 = Hi, 2 = Bye"
a = {}
for k,v in newstr:gmatch "(%d+)%s*=%s*(%a+)" do
--print(k,v)
a[k] = v
end
print(#a)
【问题讨论】:
输出是正确的。
运行 for k,v in pairs(a) do print(k,v) end 来检查表格的内容。
问题是长度运算符,默认情况下不能用于获取任何表的元素数,除了序列。
请参考Lua手册:https://www.lua.org/manual/5.4/manual.html#3.4.7
当t是一个序列时,#t返回它唯一的边框,对应于 序列长度的直观概念。当 t 不是 序列,#t 可以返回它的任何边界。 (具体取决于 表的内部表示的详细信息,这反过来又可以 取决于表的填充方式及其内存地址 非数字键。)
只有知道 t 是一个序列时才使用长度运算符。这是一个整数索引 1,..n 没有任何间隙的 Lua 表。
您没有序列,因为您只使用非数字键。这就是为什么#a 是 0
获取任何表格的元素数量的唯一安全方法是计算它们。
local count = 0
for i,v in pairs(a) do
count = count + 1
end
【讨论】:
您可以将@Piglet'代码放在a的元表中作为方法__len,用于使用长度运算符#进行表键计数。
local newstr = "3 = Hello, 67 = Hi, 2 = Bye"
local a = setmetatable({},{__len = function(tab)
local count = 0
for i, v in pairs(tab) do
count = count + 1
end
return count
end})
for k,v in newstr:gmatch "(%d+)%s*=%s*(%a+)" do
--print(k,v)
a[k] = v
end
print(#a) -- puts out: 3
如果表只包含一个序列,#a 方法 __len 的输出甚至是正确的。
【讨论】:
newtable=setmetatable({},{__index={}}) for k,v in pairs(table) do getmetatable(newtable).__index[k]=v end newtable:insert('Hello World') print(newtable:concat())