为什么在 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
在我讨论你所看到的错误之前,先介绍一些背景信息。
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
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
翻译结果:
这个解决方法非常简单,却又很深刻。我现在可以直接将加密货币、银行账户、信用卡以及其他任何想要的东西链接到Roblox或任何其他基于lua的程序中。
a = (data["result"]["amount"])