为什么在 Roblox Studio 中 table.remove 和 pairs 函数都无法使用?

我有以下的代码,Roblox Developer 和 Lua.org 手册都说这应该可以用来从表中移除一个实例,以便存储为本地变量,但本地变量仅包含一个 nil 值。

表是存在的。它在 print 函数中显示出来。它只是不会存储以便在应用程序中使用。

我尝试过多个版本的此代码,包括仅使用 pairs 函数、仅使用 table.remove 函数以及使用和不使用 table remove 的位置,这些都会生成 nil 变量。

response = HttpService:GetAsync(mining)
data = HttpService:JSONDecode(response, Enum.HttpContentType.ApplicationJson)

local function tprint(t)
    for k,v in pairs(t)  do print(k,v) end
end
tprint(data)


local a = table.remove(data, 4)
local b = table.remove(data, 3)
local c = table.remove(data, 2)
local d = table.remove(data, 1)

原文链接 https://stackoverflow.com/questions/70368567

点赞
stackoverflow用户17609838
stackoverflow用户17609838

翻译结果:

这个解决方法非常简单,却又很深刻。我现在可以直接将加密货币、银行账户、信用卡以及其他任何想要的东西链接到Roblox或任何其他基于lua的程序中。

a = (data["result"]["amount"])
2021-12-16 03:43:41
stackoverflow用户2860267
stackoverflow用户2860267

在我讨论你所看到的错误之前,先介绍一些背景信息。

Lua表格有两种索引值的方法:数字和键。通常你会看到这两种不同的方法用于描述使用它的数据结构类型。

数组和列表是使用数字键来索引信息的表格。

local arr = {}
arr[1] = "abc"
arr[2] = 123
arr[3] = true

-- 打印数组的长度
print(#arr) -- 3

-- 打印数组的内容
for i, v in ipairs(arr) do
    print(i, v)
    -- 1 abc
    -- 2 123
    -- 3 true
end

另一方面,字典、哈希映射和关联数组使用键来存储信息:

local dict = {}
dict["foo"] = "abc"
dict["bar"] = 123
dict["blah"] = true
dict["katz"] = { 1, 2, 3 }

-- 打印字典中数字键的数量
print(#dict) -- 0

-- 打印字典的内容
for k, v in pairs(dict) do
    print(k, v)
    -- foo abc
    -- bar 123
    -- blah true
    -- katz table
end

虽然Lua允许表格同时使用这两种索引方法,但重要的是永远不要混合使用两者,因为当你这样做时行为可能会变得非常奇怪。当一个表格有键时,请像处理字典一样处理它。当一个表格有数字索引时,请像处理数组一样处理它。

当你使用HttpService将JSON字符串解码为一个表格时,它会生成一个反映原始数据层次结构的字典。

你调用table.insert()table.remove()table库期望你正在使用的表格是一个数组。

当你的数据像这样排列时:

local data = {}
data["Success"] = true
data["StatusCode"] = 200
data["StatusMessage"] = "Success"
data["Headers"] = {} -- 一个标题字典
data["Body"] = {
    result = {
        amount = 1,
        depositAddress = "blah",
    },
} -- 调用HttpService:JSONDecode()之后...

当你告诉它要删除一个数字索引table.remove(data, 4)时,它不起作用,因为索引号4上没有存储任何数据。data是一个字典,而不是一个数组。

通常,尝试打印具有多层数据的表格,特别是JSON表格,是很烦人的,因为pairs函数只会索引一层。幸运的是,Roblox的print函数和输出小部件足够聪明,可以为你做到这一点。你只需简单地print(data),它将在输出中显示完整的表格,并允许你检查每个级别。

然后一旦你知道你的数据结构是什么,你就可以逐个值地遍历它。

local amount = data["Body"]["result"]["amount"]
-- 或
local amount = data.Body.result.amount
2021-12-24 06:10:30