Linux | c&cpp | Email | github | QQ群:425043908 关注本站

itarticle.cc

您现在的位置是:网站首页 -> 后端开发 文章内容

lua 语法简单介绍(table与基本函数库)-itarticl.cc-IT技术类文章记录&分享

发布时间: 9年前后端开发 118人已围观返回

Lua中的table函数库

table库由一些操作table的辅助函数组成。他的主要作用之一是对Lua中array的大小给出一个合理的解释。另外还提供了一些从list中插入删除元素的函数,以及对array元素排序函数。

table.concat(table, sep, start, end)

concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开。除了table外, 其他的参数都不是必须的, 分隔符的默认值是空字符, start的默认值是1, end的默认值是数组部分的总长.

sep, start, end这三个参数是顺序读入的, 所以虽然它们都不是必须参数, 但如果要指定靠后的参数, 必须同时指定前面的参数.

test = {"Tom", "Mary", "Jam","Hey"}

print(table.concat(test, ":"))

print("*************")

print(table.concat(test, nil, 1, 2))

print("*************")

print(table.concat(test, "\n", 2, 3))

print(table.maxn(test))

运行结果

table.insert(table, pos, value)

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

network = {

{name = "Tom" ,IP = "210.26.30.34"},

{name = "Mary" ,IP = "210.26.30.23"},

{name = "Jam" ,IP = "210.26.30.12"},

{name = "hey" ,IP = "210.26.30.30"},

}

--添加数据

table.insert(network,{name = "Feng" ,IP = "210.26.30.11"})

table.remove(table, pos)

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

network = {

{name = "Tom" ,IP = "210.26.30.34"},

{name = "Mary" ,IP = "210.26.30.23"},

{name = "Jam" ,IP = "210.26.30.12"},

{name = "hey" ,IP = "210.26.30.30"},

}

--删除最后一条数据

table.remove(network,#network)

table.sort(table, comp)

table.sort(table, comp)

table.sort()函数对给定的table进行升序排序. comp是一个可选的参数, 此参数是一个外部函数, 可以用来自定义sort函数的排序标准.

此函数应满足以下条件: 接受两个参数(依次为a, b), 并返回一个布尔型的值, 当a应该排在b前面时, 返回true, 反之返回false.

network = {"Tom","Jam","Mary"}

--升序

table.sort(network)

--降序

table.sort(network,function(a,b) return a > b end)

对于table.sort进行排序时,它还接受一个table并对其中的元素排序,如:升序、降序、按数字顺序、按符顺序或table中KEY的顺序。

network = {

{name = "Tom" ,IP = "210.26.30.34"},

{name = "Mary" ,IP = "210.26.30.23"},

{name = "Jam" ,IP = "210.26.30.12"},

{name = "hey" ,IP = "210.26.30.30"},

}

table.sort(network,function(a,b) return (a.IP < b.IP)end) --升序

table.foreachi(table, function(i, v))

会期望一个从 1(数字 1)开始的连续整数范围,遍历table中的key和value逐对进行function(i, v)操作

t1 = {2, 4, 6, language="Lua", version="5", 8, 10, 12, web="hello lua"};

table.foreachi(t1, function(i, v) print (i, "->",v) end)--等价于foreachi(t1, print)

table.foreach(table, function(i, v))

与foreachi不同的是,foreach会对整个表进行迭代。

t1 = {2, 4, 6, language="Lua", version="5", 8, 10, 12, web="hello lua"};

table.foreach(t1, function(i, v) print (i,"->", v) end) ;

table.maxn(table)

table.maxn()函数返回指定table中所有正数key值中最大的key值. 如果不存在key值为正数的元素, 则返回0. 此函数不限于table的数组部分.

test = {"Tom", "Mary", "Jam","Hey"}--默认test[1] = "Tom",test[2] = "Mary",test[3] = "Jam",test[4] = "Hey"

print(table.maxn(test))

4

table.getn(table)

返回table中元素的个数。注意:该table的key必须是有序的,索引是从1开始的, 若无序,无法得到正确的大小。如:

t1 = {2, 4, 6, language="Lua", version="5", 8, 10, 12, web="hello lua"};

print(table.getn(t1))

6

若table无序,可以这样得到大小:

for k,v in pairs(t1) do

count = count + 1

end

print(count)

9


基本函数库

assert(v[,mess age])

相当于C的断言

v:当表达式v为nil或false将触发错误,

message:发生错误时返回的信息,默认为"assertion failed!"


collectgarbage (opt [, arg])

是垃圾收集器的通用接口,用于操作垃圾收集器

opt:操作方法标志

"Stop": 停止垃圾收集器

"Restart": 重启垃圾收集器

"Collect": 执行一次全垃圾收集循环

"Count": 返回当前Lua中使用的内存量(以KB为单位)

"Step": 单步执行一个垃圾收集. 步长 "Size" 由参数arg指定 (大型的值需要多步才能完成),如果要准确指定步长,需要多次实验以达最优效果。如果步长完成一次收集循环,将返回True

"Setpause": 设置 arg/100 的值作为暂定收集的时长

"Setstepmul": 设置 arg/100 的值,作为步长的增幅(即新步长=旧步长*arg/100)


dofile (filename)

打开并且执行一个lua块,当忽略参数filename时,将执行标准输入设备(stdin)的内容。返回所有块的返回值。当发生错误时,dofile将错误反射给调用者

注:dofile不能在保护模式下运行


error (message [, level])

终止正在执行的函数,并返回message的内容作为错误信息(error函数永远都不会返回)

通常情况下,error会附加一些错误位置的信息到message头部.

Level参数指示获得错误的位置,

Level=1[默认]:为调用error位置(文件+行号)

Level=2:指出哪个调用error的函数的函数

Level=0:不添加错误位置信息


_G全局环境表(全局变量)

记录全局环境的变量值的表 _G._G = _G



getfenv(f)

返回函数f的当前环境表

f可以为函数或调用栈的级别,级别1[默认]为当前的函数,级别0或其它值将返回全局环境_G


getmetatable(object)

返回指定对象的元表(若object的元表.__metatable项有值,则返回object的元表.__metatable的值),当object没有元表时将返回nil



ipairs (t)


返回三个值 迭代函数、表、0

多用于穷举表的键名和键值对

如:for i,v in ipairs(t) do end

每次循环将索引赋级i,键值赋给v

注:本函数只能用于以数字索引访问的表如:t={"1","cash"}


load (func [, chunkname])

装载一个块中的函数,每次调用func将返回一个连接前一结的字串,在块结尾处将返回nil

当没有发生错误时,将返回一个编译完成的块作为函数,否则返回nil加上错误信息,此函数的环境为全局环境

chunkname用于错误和调试信息



loadfile ([filename])

与load类似,但装载的是文件或当没有指定filename时装载标准输入(stdin)的内容



loadstring (string [, chunkname])

与load类似,但装载的内容是一个字串

如:assert(loadstring(s))()



next (table [, index])

允许程序遍历表中的每一个字段,返回下一索引和该索引的值。

table:要遍历的表

index:要返回的索引的前一索中的号,当index为nil[]时,将返回第一个索引的值,当索引号为最后一个索引或表为空时将返回nil

注:可以用next(t)来检测表是否为空(此函数只能用于以数字索引的表与ipairs相类似)


ipairs (t)

返回三个值 next函数、表、0

多用于穷举表的键名和键值对

如:for n,v in pairs(t) do end

每次循环将索引赋级i,键值赋给v

注:本函数只能用于以键名索引访问的表如:t={id="1",name="cash"}


pcall (f, arg1, ···)

在保护模式下调用函数(即发生的错误将不会反射给调用者)

当调用函数成功能返回true,失败时将返回false加错误信息



print (···)

简单的以tostring方式格式化输出参数的内容



rawequal (v1, v2)

检测v1是否等于v2,此函数不会调用任何元表的方法



rawget (table, index)

获取表中指定索引的值,此函数不会调用任何元表的方法,成功返回相应的值,当索引不存在时返回nil

注:本函数只能用于以数字索引访问的表如:t={"1","cash"}


rawset (table, index, value)

设置表中指定索引的值,此函数不会调用任何元表的方法,此函数将返回table



select (index, ···)

当index为数字将返回所有index大于index的参数:如:select(2,"a","b") 返回 "b"

当index为"#",则返回参数的总个数(不包括index)



setfenv (f, table)

设置函数f的环境表为table

f可以为函数或调用栈的级别,级别1[默认]为当前的函数,级别0将设置当前线程的环境表


setmetatable (table, metatable)

指定的table设置元表metatable,如果metatable为nil则取消table的元表,当metatable有__metatable字段时,将触发错误

注:只能为LUA_TTABLE表类型指定元表


tonumber (e [, base])

尝试将参数e转换为数字,当不能转换时返回nil

base(2~36)指出参数e当前使用的进制,默认为10进制,如tonumber(11,2)=3


tostirng(e)

将参数e转换为字符串,此函数将会触发元表的__tostring事件



type(v)

返回参数的类型名("nil","number", "string", "boolean", "table", "function", "thread", "userdata")



unpack (list [, i [, j]])

返回指定表的索引的值,i为起始索引,j为结束索引

注:本函数只能用于以数字索引访问的表,否则只会返回nil如:t={"1","cash"}


_VERSION

返回当前Lua的版本号"Lua 5.1".



xpcall (f, err)

与pcall类似,在保护模式下调用函数(即发生的错误将不会反射给调用者)

但可指定一个新的错误处理函数句柄

当调用函数成功能返回true,失败时将返回false加err返回的结果


发布时间: 9年前后端开发118人已围观返回回到顶端

很赞哦! (1)

文章评论

  • 请先说点什么
    热门评论
    117人参与,0条评论

站点信息

  • 建站时间:2016-04-01
  • 文章统计:728条
  • 文章评论:82条
  • QQ群二维码:扫描二维码,互相交流