将字符串保存在 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 表中的主要内容,如果未能解决你的问题,请参考以下文章

lua语言:闭包模式匹配日期编译模块

如何将键值对象插入redis内部的lua表中

Lua string 哈希碰撞

lua保存缓存中文件

计算lua中的字符串索引表

Lua拆分字符串并将输出放入表中