Lua之table(表)

Lua table(表)

使用表来统一表示Lua中的一切数据,是Lua区分于其他语言的一个特色。这个特色从最开始的Lua版本保持至今,很大的原因是为了在设计上保持简洁。Lua表分为数组和散列表部分,其中数组部分不像其他语言那样,从0开始作为第一个索引,而是从1开始。散列表部分可以存储任何其他不能存放在数组部分的数据,唯一的要求就是键值不能为nil。尽管内部实现上区分了这两个部分,但是对使用者而言却是透明的。使用Lua表,可以模拟出其他各种数据结构——数组、链表、树等。

虽然设计上简洁,并且对使用者更加透明、友好,但是如果使用不当,还会造成效率性能上的差异。

table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数字、字典等。

Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。

Lua table 是不固定大小的,你可以根据自己需要进行扩容。

Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。 例如string.format表示使用"format"来索引table string。

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

======================================================

序号 方法 & 用途
1 table.concat (table [, sep [, start [, end]]]):

concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。

2 table.insert (table, [pos,] value):

在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾.

3 table.maxn (table)

指定table中所有正数key值中最大的key值. 如果不存在key值为正数的元素, 则返回0。(Lua5.2之后该方法已经不存在了,本文使用了自定义函数实现)

4 table.remove (table [, pos])

返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。

5 table.sort (table [, comp])

对给定的table进行升序排序。

table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。

-- 简单的table
mytable = {}
print("mytable 的类型是 : ", type(mytable))

mytable[1] = "Lua"
mytable["wow"] = "修改前"

print("mytable 索引为1 的元素是 : ", mytable[1])
print("mytable 索引为wow 的元素是 : ", mytable["wow"])

--alternatable和mytable的是指向同一个table
alternatable = mytable

print("alternatable 索引为1 的元素是 : ", alternatable[1])
print("alternatable 索引为wow 的元素是 : ", alternatable["wow"])

alternatable["wow"] = "修改后"

print("mytable 索引为wow 的元素是 : ", mytable["wow"])

-- 释放变量
alternatable = nil
print("alternatable 是  ", alternatable)

-- mytable仍然可以访问
print("mytable 索引为wow 的元素是 : ", mytable["wow"])

mytable = nil;

print("mytable 是 " , mytable);

运行结果:

=========================================================================

table.insert (table, [pos,] value):在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾.

table.remove (table [, pos])返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。

fruits = {"banana","orange","apple"}

-- 在末尾插入
table.insert(fruits, "mango")
print("索引为4的元素为 : ", fruits[4]);

--在索引为2的键处插入
table.insert(fruits, 2, "grapes")
print("索引为2的元素为 : ", fruits[2])

print("最后一个元素为 : ", fruits[5])
table.remove(fruits)
print("移除后最后一个元素为  :",fruits[5])

运行结果:

=======================================================================

function table_maxn(t)
	local mn = 0;
	for k,v in pairs(t)
	do
		if mn < k
		then
			mn = k;
		end
	end
	return mn;
end

tb1 = {[1] = "a",[2] = "b",[3] = "c",[26] = "z",}
print("tb1 长度 : ", #tb1)
print("tb1最大值 : ", table_maxn(tb1))

运行结果:

后记:

Lua 元表(Metatable)

在 Lua table 中我们可以访问对应的key来得到value值,但是却无法对两个 table 进行操作。

因此 Lua 提供了元表(Metatable),允许我们改变table的行为,每个行为关联了对应的元方法。

时间: 2024-10-02 06:12:35

Lua之table(表)的相关文章

Lua的Table表使用例子(便于使用查询)

一.table.insert() 1.1 1 local countries = {"China", "England", "Brazil"} 2 --尾插法(Pos不填,默认插入尾部) 3 table.insert(countries, "France") 4 --头插法(首部插入) 5 table.insert(countries, 1, "Australia") 6 7 dump(countries)

【Lua】table表删除指定元素 (转)

在对表做删除操作时,发现table.remove(table,idx)这个方法是根据table中的索引进行删除操作,而现在的需求是根据value值进行删除操作,在quick-x中也有相应的table方法封装: 1.根据table中的value值进行删除操作 -- table中删除指定元素(非根据索引) -- @param array 要操作的容器 -- @param value 删除value值 -- @param removeadll 是否删除所有相同的值 -- @return 返回删除值的个

lua基础【三】唯一数据结构table表

--[[ 数据结构table对象(一种动态分配的对象) lua中的表操作,table类型实现了"关联数组的"."关联数组是一种具有特殊索引方式的数组" 可以通过下标或者字符串来索引它,table没有固定的大小,table是Lua仅有的数据结构, 既然这么说,就表明table的意义很重大,也极为重要 我们可以用table表示普通数组,字符表,集合记录,队列,也可以通过table 表示,模块(module),包(package),对象object table的创建是通过

Cocos2d-x 脚本语言Lua基本数据结构-表(table)

table是Lua中唯一的数据结构,其他语言所提供的数据结构,如:arrays.records.lists.queues.sets等,Lua都是通过table来实现,并且在lua中table很好的实现了这些数据结构.--摘自:<Programming in Lua> 看以下代码,可以很清晰的明白Lua中表的使用: -- Lua中的表,table Config = {hello="Hello Lua",world="World"} -- 赋值方式1,以键=

lua 数据以table表的形式存储

出处:http://blog.sina.com.cn/s/blog_991afe570101rkfh.html 感谢,原文作者的无私奉献! 实现思路: table表 ------> 转为字符串(这里利用json库)------->存储--------->读取 达成目的: 解决字符串拼接问题 用最简单办法将table表存入文件,方便游戏存档.游戏关卡等等 第一步:将table表转为json格式的字符串 导入头文件 --2.2.5的quick版本已经在框架载入时完成了json模块的初始化,所

uLua/toLua加载protobuf转lua的table为bool的解决方法

当我们加载protobuf对应的lua的table的时候,我们使用如下方式来加载 local person_pb = require 'Protol.person_pb' 注意,这个table前面的Protol.这段一定不能去掉,如果去掉了,你加载到的persob_pb将会是一个bool类型的值. 如果加上这个Protol.的话,你才能加载到真正有的数据表. 也许是lua和protobuf工具关联时的一个约定,也许是这样,反正要放在protol文件夹下就能加载到数据表.

Lua中只读表和只允许修改表

Lua中的table表非常灵活强大,可以随时加入和修改,但有时在多人协作和 一些项目中有些凌乱,我们可以利用元表的性质来保护我们的一些表格. 1.Lua中的只读表 function ReadOnlyTable (t) local proxy = {} local mt = { __index = t, __newindex = function (t,k,v) error("attempt to update a read-only talbe",2) end } setmetatab

Lua学习——table

table类型实现了“关联数组”.“关联数组”是一种具有特殊索引方式的数组.不仅可以通过证书来索引它,还可以使用字符串或其他类型(除了nil)来索引它.table是Lua中主要的数据结构机制(事实也是仅有的),具有强大的功能.基于table可以以一种简单.统一和高效的方式来表示普通数组.符号表.集合.记录.队列和其他数据结构. table的特性: table是一个“关联数组”,数组的索引可以是数字或者是字符串 table 的默认初始索引一般以 1 开始 table 的变量只是一个地址引用,对 t

Lua中table类型的源码实现

  1.概述 table是lua中唯一的表示数据结构的工具.它可以用于实现数据容器.函数环境(Env).元表(metatable).模块(module)和注册表(registery)等其他各种用途.因此了解table的实现是非常有必要的,根据<Lua中数据类型的源码实现>中知道,在Lua中,table是由结构体体Table来实现的.下面将以Lua 5.2.1的源码来看table的实现.   2.实现原理 在Lua5.0以后,table是以一种混合型数据结构来实现的,它包含一个哈希表部分和一个数