【问题标题】:Can't figure out this table arrangement想不通这个餐桌布置
【发布时间】:2016-09-11 14:43:03
【问题描述】:
--The view of the table
local originalStats = {
    Info = {Visit = false, Name = "None", Characters = 1},
    Stats = {Levels = 0, XP = 0, XP2 = 75, Silver = 95},
    Inventory = {
        Hats = {"NoobHat"},
        Robes = {"NoobRobe"},
        Boots = {"NoobBoot"},
        Weapons = {"NoobSword"}
        }
    }
local tempData = {}

--The arrangement here
function Module:ReadAll(player)
  for k,v in pairs(tempData[player]) do
    if type(v) == 'table' then
      for k2, v2 in pairs(v) do
            print(k2) print(v2)
            if type(v2) == 'table'  then        
                for k3, v3 in pairs(v2) do
                    print(k3) print(v3)
                end
            else
                print(k2) print(v2)
            end
      end
    else
        print(k) print(v)
    end
  end
end

很抱歉,我似乎不知道如何将这个“ReadAll”功能安排到它会以正确的顺序显示所有正确的统计数据的位置。 输出是这样的:

Boots
table: 1A73CF10
1
NoobBoot
Weapons
table: 1A7427F0
1
NoobSword
Robes
table: 1A743D50
1
NoobRobe
Hats
table: 1A73C9D0
1
NoobHat
XP2
75
XP2
75
Levels
2
Levels
2
XP
0
XP
0

【问题讨论】:

  • 什么是“按正确的顺序”?什么顺序是对的?期望的输出是什么?
  • 我想输出信息、统计数据、帽子、长袍、靴子、武器中的所有值,并且没有重复相同的值,我该怎么做?我测试了几个小时,但这就是我所得到的。
  • 举个例子输入表(tempData[player])和你想得到的输出。
  • 也许只是删除第一行print(k2) print(v2)(你有两个)?

标签: lua roblox


【解决方案1】:

这是一种打印所有元素而不显示双精度或表参考值的方法。 顾名思义,这个函数将打印一个表中的所有元素,不管它里面有多少嵌套表。我目前没有办法订购它们,但如果我找到办法,我会更新我的答案。您也可以去掉打印行中的空白,我只是使用它,这样看起来会更整洁。让我知道它是否有效。

function allElementsInTable(table)
    for k,v in pairs(table) do
        if type(table[k]) == 'table' then
            print(k .. ":")
            allElementsInTable(v)
        else
            print("  " .. k .. " = " .. tostring(v))
        end
    end
end

--place the name of your table in the parameter for this function
allElementsInTable(originalStats)

【讨论】:

    【解决方案2】:

    经过更多的实验,我得到了这个,如果有人想要它,请随意使用它。

    tempData = { Info = {Visit = false, Name = 'None'},
        Stats = {LVL = 0, XP = 0, Silver = 75},
        Inventory = { Armors = {'BasicArmor'},
        Weapons = {'BasicSword'} }
    
        }
    
    
        function Read()
        for i, v in pairs(tempData['Info']) do
         print(i..'\t',v)
        end
        ----------
        for i2, v2 in pairs(tempData['Stats']) do
         print(i2..'\t',v2)
        end
        ----------
        for i3, v3 in pairs(tempData['Inventory']) do
         print(i3..':')
         for i4, v4 in pairs(v3) do
            print('\t',v4)
         end
        end
        end
    
        Read()
    

    【讨论】:

      【解决方案3】:

      不要期望表的字段会以特定顺序使用pairs() 进行迭代。内部 Lua 表是哈希表,并且根本没有指定其中字段的顺序。它会在运行之间发生变化,您不能让它们按照填充顺序进行迭代。
      只有具有连续整数索引的数组才能保持其元素的顺序。

      【讨论】:

      • 如果这是不可能的,是否有可能将表恢复到从数据存储加载时的位置,我该怎么做?
      • 您只需加载您拥有的任何内容,确切的加载顺序并不重要。重要的是要有一些具有已知名称和预期内容的字段。
      • 我发布了一个答案,但我想知道我在下面做了什么,会改变顺序吗? Temp = {} Orig = {Info = {Visit = false, Name = 'None'}, Inventory = {Hat = {'Basic'}, Robe = {'Basic'} }} Temp = Orig -- 当我移动将原始值转换为 Temp,顺序会改变吗?我保存代码然后加载它怎么样?
      • 表中元素的顺序(如pairs() 所见)不保证与分配这些元素的顺序相同。在您建议的答案中,您以某种预定义的顺序明确读取了一些元素,但这与pairs() 无关。并且这些表中的元素(如 LVL、XP、Silver)仍然可能在您使用这些元素创建新表和/或表存储元素由于添加新元素而重新散列时更改顺序。顺便说一句,你真的需要一些特定的订单吗?
      • 为什么需要一些订单?如果保存看起来像 {XP=100, LVL=8,Silver=1000} 或 {LVL=8,XP=100,Silver=100} 或 {Silver=1000,XP=100,LVL =8} ?你的脚本只会读取像save.Stats.LVL这样的所需数据,它并不关心那里的任何订单。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-26
      • 1970-01-01
      • 2010-12-10
      相关资源
      最近更新 更多