Lua学习笔记之tables与bjects

1、  table是Lua中唯一的数据结构,其他语言提供的其他数据比如:arrays、records、lists、queues、sets等,Lua都是通过table来实现的。

2、  数组

在Lua中通过整数下标访问表中的元素即可简单的实现数组,并且数组不必事先指定大小,大小可以随需要动态的增长。

通常我们初始化数组的时候就间接的定义了数组的大小,例如:

a = {}

for i = 1,1000 do

a[i] = 0

end

通过初始化,数组a的大小已经确定为1000,企图访问1-1000以外的下标对应的值将返回nil。你可以根据需要定义数组的下标从0,1或者其他的数值,例如:

a = {}

for i = -5,5 do

a[i] = 0

end

然而在lua中习惯上数组的下标从1开始,lua的标准库与此习惯保持一致,因此如果你的数组下标也是从1开始你就可以直接使用标准库的函数,否则无法直接使用。我们可以再用构造器在创建数组的同时并初始化数组:

Squares={1,4,9,16,25,36,49,64,81}

3、  阵和多维数组

Lua中主要有两种表示矩阵的方法,第一种是用数组的数组表示。也就是说一个表的元素是另一个表。例如我们创建一个n行m列的矩阵:

mt ={}

for i=1,N do

mt[i] = {}

for j = 1,M do

mt[i][j] = 0

end

end

由于lua中table是一个对象,所以对于每一行我们必须显示的创建一个table,这看起来比c沉余,另一方面它也提供了蛮多的灵活性,例如可以修改前面的例子来创建一个三角矩阵:

for j = 1,M do

改成  for j=1,i do

这样实现的三角矩阵比起整个矩阵,仅仅使用一半的内存空间。第二个中表示矩阵的方法是将行和列组合起来,如果索引下标都是整数,通过第一个索引乘以一个常量(列)再加上第二个索引,看下面的例子实现创建n行m列的矩阵:

mt = {}

for i =1,N do

for j =1,M do

mt[i*M+j] = 0

end

end

4、  链表

Lua中用tables很容易实现链表,每一个节点是一个table,指针是这个表的一个域,并且指向另一个table。例如,要实现一个只有两个域:值或指针的基本链表,代码如下:

跟节点

list = nil

在链表开头插入一个值为v的节点:

list = {next = list,value = v}

要遍历这个链表只需要:

Local l = list

While l do

print(l.value)

l = l.next

end

5、  队列和双端队列

虽然可以使用Lua的table库提供的insert和remove操作实现队列,但这种方式实现的队列针对大数据时效率太低,有效的方式是使用两个索引下标,一个表示第一个元素,另一个表示最后一个元素。

Function ListNew()

Return (first = 0,last = -1)

end

为了避免污染全局命名空间,我们重写上面的代码,将其放在一个名为list的table中:

List = {}

function List.new()

return (first =0,last = -1)

end

下面,我们可以在常量时间内,完成在队列的两端进行插入和删除操作。

function List.pushleft(list,value)

local first = list.first-1

list.first = first

list[first] = value

end

function List.pushright (list,value)

local last = list.last+1

list.last = last

list[last] = value

end

function List.poleft(list)

local first = list.first

if first>list.last then error(“list is empty”)

local value = list[first]

list[first] = nil

list.first = first+1

return value

end

function List.popright(list)

local last = list.last

if list.first>last then error(“list is empty”)

local value = list[last]

list[last] = nil

list.last = last-1

return value

end

6、  集合和包

假定你像列出在一段源代码出现的所有标识符,某种程度上,你需要过滤掉那些语言本身的保留字。

Lua中表示这个集合有一个简单有效的方法,将所有集合中的元素作为下标存放在一个table里,下面不需要查找table,只需要测试看对于给定的元素,表的对应下标的元素是否为nil,例如:

reserved = {

[“while”] = true,

[“end”] = true,

[“function”] = true,

[“local”] = true,

}

for w inallowords() do

if reserved[w] then

--‘w’is a reservedword

还可以使用辅助函数更加清晰的构造集合:

function Set(list)

local Set = {}

for _,l in ipairs[list] do set[1] =true end

return set

end

reserved = Set{“while”,”end”,”function”,”local”,}

时间: 2024-10-22 08:55:38

Lua学习笔记之tables与bjects的相关文章

Lua学习笔记(八):数据结构

table是Lua中唯一的数据结构,其他语言所提供的数据结构,如:arrays.records.lists.queues.sets等,Lua都是通过table来实现,并且在Lua中table很好的实现了这些数据结构. 1.数组 在Lua中通过整数下标访问table中元素,既是数组,并且数组大小不固定,可动态增长.通常我们初始化数组时,就间接地定义了数组的大小,例如: 1 a = {} -- new array 2 for i=1, 1000 do 3 a[i] = 0 4 end 5 6 --数

Lua学习笔记(七):迭代器与泛型for

1.迭代器与闭包 迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素.在Lua中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素. 迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道来自于哪里和将要前往哪里.闭包提供的机制可以很容易实现这个任务.记住:闭包是一个内部函数,它可以访问一个或者多个外部函数的外部局部变量.每次闭包的成功调用后这些外部局部变量都保存他们的值(状态).当然如果要创建一个闭包必须要创建其外部局部变量.所以一个典型的闭包的结构包含

Lua学习笔记9:多文件

一 终端中执行多个文件:-l 加入在文件一中定义了一个变量,在另一文件中输出这个变量,代码如下: --file1.lua num = 100 --file2.lua print(num) 终端输入(注意:不是lua命令行): lua -lfile1 -lfile2 注意:不要加上文件后缀名.lua 二 命令行中加载文件 --lib.lua function norm(x, y) local n2 = x^2 + y^2 return math.sqrt(n2) end function twic

lua学习笔记10:lua简单命令行

前面多次用了命令行,这次就好好学下命令行: 一 格式 lua [options][script][args] 二 具体命令 -e 直接将命令传个lua -l 加载一个文件 -i 进入交互模式 例如,终端输入: lua -e "print(math.sin(12))" lua学习笔记10:lua简单命令行,布布扣,bubuko.com

lua学习笔记11:lua中的小技巧

lua中的小技巧,即基础lua语言本身的特种,进行一个些简化的操作 一 巧用or x = x or v 等价于: if not x then x = v end 如果x为nil或false,就给他赋值为 二 三元运算符实现 a and b or c 类似C语言: a ? b : c and 的运算由优先级高于or lua学习笔记11:lua中的小技巧,布布扣,bubuko.com

Lua学习笔记(三):表的构造

构造器是创建和初始化表的表达式.表是Lua特有的功能强大的东西.最简单的构造函数是{},用来创建一个空表.可以直接初始化数组: 1 days = {"Sunday", "Monday", "Tuesday", "Wednesday", 2 "Thursday", "Friday", "Saturday"} Lua将“Sunday”初始化days[1](第一个元素索引为

lua学习笔记之基本语法

Lua学习笔记之基本语法 1.  赋值语句 赋值是改变一个变量的值和改变表域的最基本的方法. a = "hello".."world" t.n = t.n+1 lua可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会一次赋给左边的变量. a,b = 10,2*x    <-->a = 10;b = 2*x 遇到赋值语句lua会先计算右边所有的值然后再执行赋值操纵,所以我们可以这样进行交换变量的值: x,y = y,x    

lua学习笔记之函数

Lua学习笔记之函数 1.  函数的作用 函数主要完成指定的任务,这样的情况下函数作为调用语句使用,函数可以计算并返回值,这样的情况下函数作为赋值语句的表达式使用. 语法: funcationfunc_name(arguments-list) Statements-list end 调用函数的时候,如果参数列表为空,必须使用()表示是函数调用. Print(8*9,9/8) a = math.sin(3) +math.cos(10) print(os.date()) 上述规则有一个例外,当函数只

Lua学习笔记(2) —— 风格

前一篇大概学习了lua常用的语法,都是些刚入门时应该了解的.见这里 Lua学习笔记(1) ——语法 这篇主要记录一些关于lua代码风格的经验,如果不了解它们,还是拿着函数式或传统面向对象的风格去写lua,就永远无法了解lua的精华之所在,弃之所长,取其所短. 1. 函数类型的变量 2. 匿名函数 3. 闭包 4. 表 5. 协程 6. 虚拟机