Lua——table(表)的使用

2023-11-09


一、基本知识

(1)table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。
(2)Lua table 使用关联型数组,可以用任意类型的值来作数组的索引,但这个值不能是 nil
(3)Lua table 是不固定大小的,你可以根据自己需要进行扩容。
(4)Lua也是通过table来解决模块、包和对象的。 例如string.format表示使用"format"来索引table string。
说白了,table的存储方式和使用方式就类似是key-value对。

二、table的构造

1.使用步骤

构造器是创建和初始化表的表达式。表是Lua特有的功能强大的东西。最简单的构造函数是{},用来创建一个空表。可以直接初始化数组:

-- 初始化表
mytable = {}

-- 指定值
mytable[1]= "Lua"

-- 移除引用
mytable = nil
-- lua 垃圾回收会释放内存

2.示例演示

当我们为 table1 设置元素,然后将 table1赋值给 table2,则 table1 与table2都指向同一个内存。如果table1设置为 nil ,则 table2同样能访问 table1的元素。如果没有指定的变量指定这个内存,Lua的垃圾回收机制会清理相对应的内存。

--初始化table1
table1 = {}
print("table1的类型是:",type(table1))

table1["age"] = 22
table1["name"] = "xiaomeng"
print("table1中的age数据类型为:",type(table1["age"]),
	  "table1中的name数据类型为:",type(table1["name"]))
print("table1中的age为:",table1["age"],
      "table1中的name为:",table1["name"])

--table2和table1共享数据
table2 = table1
table2["age"] = 19
table2["name"] = "xiaohua"
print("table1中的age数据类型为:",type(table1["age"]),
	  "table1中的name数据类型为:",type(table1["name"]))
print("table1中的age被改为:",table1["age"],
      "table1中的name被改为:",table1["name"])

--由于tbale1和table2共享数据,所以table2的操作table1受影响
table2[1]=3
print(table1[1])

table1 = nil--释放table1变量,但是table2仍然可以访问
print("table2中的age和name数据分别为:",table2["age"],table2["name"])

table1 = nil--释放table2变量
--Lua垃圾回收会释放内存

运行结果:
在这里插入图片描述

三、table的操作

1.操作语法

在这里插入图片描述

2.示例演示

(1)连接演示
注意sep是分隔符,start和end不写的话,就默认从头连接到尾。

table1={1,"wer","asdf",3}

print(table.concat(table1))         --默认将所有内容都连接起来
print(table.concat(table1, "@1"))   --默认将所有内容都连接起来,且用两段之间用'@1'分割
print(table.concat(table1,"@2",2))  --将table1的内容从第二个到末尾连接起来,'@2'分割
print(table.concat(table1,"@3",2,3))--将table1的内容从第2个连接到第3个,用'@3'分割

运行结果:
在这里插入图片描述
(2)插入和删除演示
pos可选,不写的话,默认在尾部插入

--注意数据结构table下标从1开始
table1={1,2,3,"a","b"}

table.insert(table1,"c")
print("table1[6]的值为:",table1[6])

table.insert(table1,4,"d")
print("table1[4]的值为:",table1[4])

print("现在table1的内容为:",table.concat(table1,","))

c=table.remove(table1)--默认返回最后一个元素,并且将其移除
print("被移除的元素为:",c)
print("现在table1的内容为:",table.concat(table1,","))

c=table.remove(table1,1)--返回第一个元素,并且将其移除
print("被移除的元素为:",c)
print("现在table1的内容为:",table.concat(table1,","))

运行结果:
在这里插入图片描述
(3)排序演示

table1={"aqwer","basdf","cadef","awertt"}
print("现在table1中的内容为:",table.concat(table1,","))

table.sort(table1)
print("排序后table1中的内容为:",table.concat(table1,","))

table1=nil

运行结果:
在这里插入图片描述

able1={1,3,5,7,2,1}
print("现在table1中的内容为:",table.concat(table1,","))
table.sort(table1)
print("排序后table1中的内容为:",table.concat(table1,","))

table1=nil

运行结果:
在这里插入图片描述
当内容中既有number类型又有string类型的元素时,无法进行排序。

对于table.maxn函数,Lua5.0版本后无法使用此函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lua——table(表)的使用 的相关文章

  • 用于数据存储的 Lua 与 XML

    我们中的许多人都被灌输了使用 XML 来存储数据的观念 它的优点和缺点众所周知 我当然不想在这里讨论它们 然而 在我用 C 编写的项目中 我也使用 Lua 我非常惊讶 Lua 能够如此出色地存储和处理数据 然而 Lua 的这一方面却鲜为人知
  • Lua中如何去除字符串中的空格?

    我想从 Lua 中的字符串中删除所有空格 这是我尝试过的 string gsub str string gsub str string gsub str s 这似乎不起作用 如何删除所有空格 它有效 您只需分配实际结果 返回值 使用以下变体
  • lua检查多个值是否相等

    我喜欢用 Roblox 制作游戏 并用 lua 编写代码 在编写游戏时 我发现自己经常问一个值是否等于另一个值 这可能会产生很长的代码行 并且可能非常重复 例如 如果 x ClassName 衬衫 或x ClassName 附件 或x Cl
  • Lua:“拖动”数组中的元素序列

    我正在尝试创建一个函数 将连续数量的元素 拖动 到数组中的新位置 并限制为数组的当前大小 其他项目应该围绕 拖动 的项目晃动 例如 如果我的数组有 7 个元素 并且我想拖动中间的三个 1 2 3 4 5 6 7 lt keys a b C
  • LuaJit FFI 从 C 函数返回字符串到 Lua?

    假设我有这个 C 函数 declspec dllexport const char GetStr static char buff 32 Fill the buffer with some string here return buff 这
  • 如何更新lua中的时间以反映执行过程中系统时区的变化?

    Problem 我想修改awful widget textclockAwesome wm 中的小部件可以立即反映系统时区的更改 这个小部件和所有的 Awesome wm 配置都是用 lua 编写的 目前 如果系统时区发生更改 小部件将继续根
  • Lua - 尝试调用全局(零值)

    执行此代码时 出现错误 尝试调用全局 forId 零值 function execute args local itemid 526 local bone forId itemid this is where the error occur
  • 了解静态链接嵌入式lua环境中lua扩展dll的构建/加载

    我有一个相对复杂的 lua 环境 我试图了解以下内容如何工作 起始设置包括以下两个模块 主要应用 无lua环境 DLL 静态链接到lua lib 包括解释器 该 dll 被加载到主应用程序中 并运行 lua 控制台解释器和可从控制台访问的
  • 什么更快?循环或多个 if 条件

    我想知道什么更快 是只用一条指令 即 1 1 执行 9 次 for 循环还是执行 9 个 if 条件时 我认为 if 更快 因为您不需要检查循环中的指令 它应该几乎相同 因为for循环本质上是检查if条件为真并运行一段代码 非常类似于if声
  • 循环直到在表中找到 2 个特定值?

    我试图找到一种更聪明的方法来解决这个问题 这是与游戏相关的代码的摘录 它循环遍历每个背包的每个插槽 直到找到铲子和绳子 local continue local foundShovel foundRope for i 0 Container
  • Redis 排序集和解决关系

    我正在使用 Redis 排序集来存储我正在处理的项目的排名 我们没有预料到 我们想要如何处理关系 Redis 按字典顺序对具有相同分数的条目进行排序 但我们想要做的是对具有相同分数的所有条目给予相同的排名 例如在以下情况 redis 127
  • Redis INCRBY 有限制

    我想知道是否有一种方法可以通过我的应用程序的单次往返在 Redis 中执行此操作 对于给定的键K 其可能值V是范围内的任意整数 A B 基本上 它有上限和下限 When an INCRBY or DECRBY发出命令 例如INCRBY ke
  • Lua userdata:无法同时进行数组访问和方法

    我遇到了这个人的问题 Lua userdata数组访问及方法 https stackoverflow com questions 26970316 lua userdata array access and methods 其中 当我设置用
  • 为什么 LuaJIT 这么好?

    编辑 不幸的是 LuaJIT 已从下面链接的比较中删除 This 比较 http shootout alioth debian org u64 which programming languages are fastest php编程语言的
  • 使用 FastCGI 运行 Lua 脚本

    我目前正在尝试找出使用 FastCGI 与 lighttpd 或 Nginx 一起运行 Lua 脚本的方法 我唯一能挖到的是WSAPI http keplerproject github com wsapi 开普勒计划的一部分 但我想知道是
  • lua中的权限问题

    是否需要在 corona build settings 中设置一些特定权限才能将高分永久保存在文件中 每次运行代码时都会出现 权限被拒绝 的错误 如何纠正这个错误 这是我尝试过的代码 function read score local f1
  • Lua 访问表的键和值

    我想在关卡编辑器中读取 Lua 文件 这样我就可以以可视化格式显示其数据供用户编辑 如果我有一个像这样的 Lua 表 properties Speed 10 TurnSpeed 5 Speed显然是关键并且10价值 我知道如果我知道像这样的
  • 如何在lua中获取shell脚本的返回码?

    我正在lua中执行一个脚本 os execute sh manager scripts update system sh f 我想获得脚本的输出 如果退出状态为 7 则返回 7 I tried local output os execute
  • 如何通过 C API 在自己的环境中执行不受信任的 Lua 文件

    我想通过调用在其自己的环境中执行不受信任的 lua 文件lua setfenv http pgl yoyo org luai i lua setfenv这样它就不会影响我的任何代码 该函数的文档仅解释了如何调用函数 而不解释如何执行文件 目
  • Lua C API:初始化结构体 C 中的变量矩阵

    我正在尝试使用 Lua C API 创建一个用户数据 并在其中关联一个元表 我将在其中收集矩阵 我无法得到的是如何将初始化矩阵的每个分量设置为零 我按照我的描述编译我的 Lua 模块 C 代码here https stackoverflow

随机推荐