将字符串保存在 lua 表中
Posted
技术标签:
【中文标题】将字符串保存在 lua 表中【英文标题】:save strings in lua table 【发布时间】: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)
【问题讨论】:
【参考方案1】:输出是正确的。
运行 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
【讨论】:
是的,我明白了。谢谢【参考方案2】:您可以将@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
的输出甚至是正确的。
您可以在 Lua 沙盒中在线查看... ...复制和粘贴。 和我一样。
【讨论】:
恕我直言,建议这样的事情作为一般解决方案并不是一个好主意。您不想让给每个表一个 __len 元方法成为初学者的习惯。我什至不确定您是否应该面对任何不了解 Lua 运算符与元表的默认行为的初学者。对于少数情况,您需要可以调用函数的表字段数。我可能会将它添加到表库中。还可以安全地假设 OP 已经知道如何复制和粘贴和运行 Lua 代码,因为他抱怨得到意外结果。 ;-) 没有冒犯 你在表库中放了这样一个函数。我将表库函数一一放入设计为表的表的__index方法中,之后我可以在不影响原始表库的情况下更改它们。 - 就是这么简单:newtable=setmetatable(,__index=) for k,v in pairs(table) do getmetatable(newtable).__index[k]=v end newtable:insert('Hello World') print(newtable:concat())
以上是关于将字符串保存在 lua 表中的主要内容,如果未能解决你的问题,请参考以下文章