【问题标题】:save strings in lua table将字符串保存在 lua 表中
【发布时间】: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)

【问题讨论】:

    标签: lua lua-table


    【解决方案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())
    猜你喜欢
    • 2021-12-11
    • 1970-01-01
    • 2016-06-01
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    • 2015-01-16
    • 2020-02-20
    相关资源
    最近更新 更多