【问题标题】:How to print all values in a Lua table?如何打印 Lua 表中的所有值?
【发布时间】:2021-04-05 12:28:13
【问题描述】:

如果我有这样的表格,我将如何打印所有值?

local Buyers = {
    {[Name] = "Birk", [SecName] = "Birk2nd", [ThirdName] = "Birk3nd"},
    {[Name] = "Bob", [SecName] = "Bob2nd", [ThirdName] = "Bob3nd"},
}

它应该最终打印出来:

First Name: Birk
Second Name: Birk2nd
Third Name: Birk3nd

FirstName: Bob
Second Name: Bob2nd
Third Name: Bob3nd

【问题讨论】:

  • 标准库没有提供简单的方法来做到这一点。您是否尝试过自己编写代码?
  • 是的,我尝试自己编写代码,否则我不会在这里问,但我想我找到了解决方案for k, data in pairs(Buyers) do print(data) for key, value in pairs(data) do print(key) print(value) end end
  • 初始化Buyers 的代码不会像您预期的那样运行。 NameSecNameThisdName 是变量,如果之前没有初始化,则等于 nil,而不是文字。要么用引号括起来,要么去掉括号。
  • local Buyers = { {["Name"] = "Birk", ["SecName"] = "Birk2nd", ["ThirdName"] = "Birk3nd"}, {["Name"] = "Bob", ["SecName"] = "Bob2nd", ["ThirdName"] = "Bob3nd"}, } 用于买家表

标签: arrays lua lua-table


【解决方案1】:

对于你的情况,像这样:

local function serialise_buyer (buyer)
    return ('First Name: ' .. (buyer.Name or '')) .. '\n'
        .. ('Second Name: ' .. (buyer.SecName or '')) .. '\n'
        .. ('Third Name: ' .. (buyer.ThirdName or '')) .. '\n'
end

local Buyers = {
    {Name = "Birk", SecName = "Birk2nd", ThirdName = "Birk3rd"},
    {Name = "Bob", SecName = "Bob2nd", ThirdName = "Bob3rd"},
}

for _, buyer in ipairs (Buyers) do
    print (serialise_buyer (buyer))
end

更通用的解决方案,带排序:

local sort, rep, concat = table.sort, string.rep, table.concat

local function serialise (var, sorted, indent)
    if type (var) == 'string' then
        return "'" .. var .. "'"
    elseif type (var) == 'table' then
        local keys = {}
        for key, _ in pairs (var) do
            keys[#keys + 1] = key
        end
        if sorted then
            sort (keys, function (a, b)
                if type (a) == type (b) and (type (a) == 'number' or type (a) == 'string') then
                    return a < b
                elseif type (a) == 'number' and type (b) ~= 'number' then
                    return true
                else
                    return false
                end
            end)
        end
        local strings = {}
        local indent = indent or 0
        for _, key in ipairs (keys) do
            strings [#strings + 1]
                = rep ('\t', indent + 1)
               .. serialise (key, sorted, indent + 1)
               .. ' = '
               .. serialise (var [key], sorted, indent + 1)
        end
        return 'table (\n' .. concat (strings, '\n') .. '\n' .. rep ('\t', indent) .. ')'
    else
        return tostring (var)
    end
end

local Buyers = {
    {Name = "Birk", SecName = "Birk2nd", ThirdName = "Birk3rd"},
    {Name = "Bob", SecName = "Bob2nd", ThirdName = "Bob3rd"},
    [function () end] = 'func',
    [{'b', 'd'}] = {'e', 'f'}
}
print (serialise (Buyers, true))

【讨论】:

  • 我觉得这太过分了
  • 太复杂了
  • 无论你怎么看,这都是太多的代码。另外,不要为了好玩而本地化变量,这只会降低代码的可读性并混淆 IDE。
  • @DarkWiiPlayer 本地化函数可以提高性能。 Lua Gems 性能提示中对此进行了介绍。这是关于该主题的 SO 问题:stackoverflow.com/questions/32945039/…
  • 一个更好的示例 SO 问题和答案:stackoverflow.com/questions/18093728/…
【解决方案2】:

我能想到的

local Buyers = {
  {["Name"] = "Birk", ["SecName"] = "Birk2nd", ["ThirdName"] = "Birk3nd"},
  {["Name"] = "Bob", ["SecName"] = "Bob2nd", ["ThirdName"] = "Bob3nd"},
}

for _, person in pairs(Buyers) do
  print("First name: "..person.Name)
  print("Second name: "..person.SecName)
  print("Third name: "..person.ThirdName)
  print()
end

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 2019-04-18
    • 2018-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多