【问题标题】:Array return are sort in reverse and i dont know why数组返回是反向排序的,我不知道为什么
【发布时间】:2022-12-10 19:56:29
【问题描述】:

我有一个奇怪的问题,从昨天开始我就无法在 Garry's Mod (GLua) 上解决
当我的 gmod 服务器游戏运行时,我注意到数组上存在错误,当它们被正确指定时,某些键为空,而在进行深度测试时,我注意到返回的数组是......倒退的。

下面是一个数组:

bigArray = {
    [ "default" ] = { 4, 2, 1 },
    [ "police" ] = { 4, 2, 1 },
    [ "mayor" ] = { 5, 2, 1 },
    [ "sherif" ] = { 6, 2, 1 },
}

好的,接下来我将使用PrintTable()方法(PrintTable()是游戏中已经集成的方法) 显示数组的内容(这种方法,通常如果我运行 PrintTable(bigArray) 结果应该是上面的数组,但这里是显示的结果:

{
    [ "sherif" ] = { 6, 2, 1 },
    [ "mayor" ] = { 5, 2, 1 },
    [ "police" ] = { 4, 2, 1 },
    [ "default" ] = { 4, 2, 1 },
}

我将举一个更能说明问题的例子,因为前一个是字典而不是数组:

table = {
   'truc',
   'machin',
   'chose'
   }

如果我像这样显示表的第一个元素print(table[1]),显示的结果将是:chose

把桌子倒过来让我使用的很多插件崩溃,我不知道这是怎么发生的,它是在我没有修改任何插件的情况下突然发生的(我已经看过 worshop 插件,他们都不对这个问题负责) 如果有人知道这是怎么造成的,我很感兴趣,谢谢。

【问题讨论】:

  • 可能是因为“请注意,对于 Lua,数组也没有顺序。” quote
  • 看起来您的某些插件依赖于未定义的迭代顺序。
  • print(table[1]), the displayed result will be: chose - 不可重现,数组和表键没有相同的行为:)。请注意,no order to keys in a table 的顺序没有颠倒(即您不能也不应该期望任何顺序)。
  • 也许 GarrysMod 有自己的 Lua 表实现。 GMod Lua 与普通 Lua 有很大不同。
  • @AD7six 我知道他们没有任何特定的顺序,尤其是在 for 中,但是索引不应该像那样突然改变,尤其是在我从未接触过的脚本上,到目前为止索引一直是有序的它被宣布。

标签: arrays sorting lua lua-table garrys-mod


【解决方案1】:

我注意到返回的数组是......向后

它们不是数组。它们是字典(无序的键值对集)。

Lua 中的数组如下所示:

bigArray = {
    { name="default", 4, 2, 1 },
    { name="police",  4, 2, 1 },
    { name="mayor",   5, 2, 1 },
    { name="sherif",  6, 2, 1 },
}

在这种情况下,元素的顺序被保留:

$ lua
Lua 5.4.4  Copyright (C) 1994-2022 Lua.org, PUC-Rio
> bigArray = {
    { name="default", 4, 2, 1 },
    { name="police",  4, 2, 1 },
    { name="mayor",   5, 2, 1 },
    { name="sherif",  6, 2, 1 },
}
> bigArray[1].name # This will _always_ be "default"
default 

【讨论】:

  • ok,但是问题还是一样,不管是数组还是字典,都是反向返回的
  • @MrMarrant 请编辑问题以证明这一点。
  • @AD7six 我这样做了,在新示例中,元素改变了位置,“选择”从索引 3 到索引 1,并且没有操作。
  • @MrMarrant 问题中没有对此进行演示,如果不能依赖数组键,这对语言来说将是一个相当重要的问题 - 因此重要的是要看到演示,而不仅仅是“我正在看到 x”声明。
【解决方案2】:

在 Garry's Mod 中,词典没有以任何特定顺序存储。如果你想按顺序遍历字典,而不是使用pairs,你必须使用SortedPairsSortedPairsByMemberValueSortedPairsByValue。 请参阅this wiki 页面以供参考。

对于您的实施,我建议为您的 bigArray 字典的每个成员值添加一个字段以指定排序顺序;例如:

local bigArray = {
    [ "default" ] = {
        sortOrder = 1,
        myValues = { 4, 2, 1 }
    },
    [ "police" ] = {
        sortOrder = 2,
        myValues = { 4, 2, 1 }
    },
    [ "mayor" ] = {
        sortOrder = 3,
        myValues = { 5, 2, 1 }
    },
    [ "sherif" ] = {
        sortOrder = 4,
        myValues = { 6, 2, 1 }
    }
}

这将允许您按 sortOrder 值的顺序进行迭代,如下所示:

for key, value in SortedPairsByMemberValue(bigArray, "sortOrder") do
    print("
" .. key .. ":")
    PrintTable(value)
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 2013-08-23
    • 2015-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多