Lua中的table构造式(table constructor)
最简单的构造式就是一个空构造式{},用于创建一个空table。
构造式还可以用于初始化数组。例如,以下语句:
days = {"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"}
会将days[1]初始化为字符串“Sunday”、days[2]初始化为"Monday",以此类推。
Lua还提供了一种特殊的语法用于初始化记录风格的table:
a = {x=10, y=20}
以上这行代码等价于这些语句:
a = {}; a.x=10; a.y=20
无论使用哪种方式来创建table,都可以在table创建之后添加或删除其中的某些字段。
【使用table编写链表】
我们可以使用这样的方式使用table编写一个链表代码:每当Lua评估一个构造式时,都会先创建一个新table,然后初始化它。如下:
list = nil
for line in io.lines() do
list = {next=list, value=line}
end
这段代码从标准输入中读取每行的内容,然后将每行按相反的次序存储到一个链表中。链表的每个节点都是一个table,table中含有两个字段:value(每行的内容)和next(指向下一个结点的引用)。以下代码便利了改练表,并打印了其内容:
local l = list
while l do
print(l.value)
l = l.next
end
可以将记录风格的初始化与列表风格的初始化混合在一个构造式中使用:
polyline = {color="blue",thickness=2,npoints=4,
{x=0, y=0},
{x=-10, y=0},
{x=-10, y=1},
{x=0, y=1}
}
print(polyline[2].x) --> -10
print(polyline[4].y) --> 1
这两种风格(列表风格和记录风格)的构造式各有其限制。例如,不能使用负数的索引,也不能用运算符作为记录的字段名。为了满足这些要求,Lua还提供了一种更通用的格式。这种格式允许在方括号之间,显式地用一个表达式来初始化索引值:
opnames = {["+"] = "add", ["-"] = "sub",
["*"] = "mul", ["/"] = "div"}
i = 20; s = "-"
a = {[i+0] = s, [i+1] = s .. s, [i+2] = s .. s .. s}
print(opnames[s]) --> sub
print(a[22]) --> ---
这种语法看似烦琐了一点,但却非常灵活。无论是列表风格的初始化,还是记录风格的初始化,其实都是这种通用语法特例。构造式{x=0,y=0}等价于{["x"]=0,["y"]=0},构造式{"r","g","b"}等价于{[1]="r",[2]="g",[3]="b"}。
对于某些特殊情况如果真的需要以0作为一个数组的起始索引的话,通过这种语法也可以轻松做到:
days = {[0]="Sunday","Monday","Tuesday","Wednesday",
"Thursday","Friday","Saturday"}
在一个构造式中还可以用分号(;)替代逗号(,)。
Lua中的table构造式(table constructor)的更多相关文章
- Lua中的weak表——weak table
弱表(weak table)是一个很有意思的东西,像C++/Java等语言是没有的.弱表的定义是:A weak table is a table whose elements are weak ref ...
- Lua中的weak表——weak table(转)
弱表(weak table)是一个很有意思的东西,像C++/Java等语言是没有的.弱表的定义是:A weak table is a table whose elements are weak ref ...
- lua中,两种json和table互转方法的效率比较
lua中json和table的互转,是我们在平时开发过程中经常用到的.比如: 在用lua编写的服务器中,如果客户端发送json格式的数据,那么在lua处理业务逻辑的时候,必然需要转换成lua自己的数据 ...
- Lua中的表达式
[算术操作符] Lua支持常规的算术操作符有:”+”(加法),”-“(减法),”*”(乘法),”/”(除法),”^”(指数),”%”(取模),一元的”-“(负号).所有的这些操作符都用于实数.例如:x ...
- Lua中的函数
[前言] Lua中的函数和C++中的函数的含义是一致的,Lua中的函数格式如下: function MyFunc(param) -- Do something end 在调用函数时,也需要将对应的参数 ...
- Lua中的一些库(1)
[数学库] 数学库(math)由一组标准的数学函数构成.这里主要介绍几个常用的函数,其它的大家可以自行百度解决. 三角函数(sin,cos,tan……)所有的三角函数都使用弧度单位,可以用函数deg( ...
- Lua中的元表与元方法
[前言] 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了“+”符号,就可以进行类的加法运算.在Lua中也有这个道理 ...
- Lua中的metatable详解
转自:http://www.jb51.net/article/56690.htm Lua 中 metatable 是一个普通的 table,但其主要有以下几个功能: 1.定义算术操作符和关系操作符的行 ...
- Lua中的元表与元方法学习总结
前言 元表对应的英文是metatable,元方法是metamethod.我们都知道,在C++中,两个类是无法直接相加的,但是,如果你重载了"+"符号,就可以进行类的加法运算.在Lu ...
随机推荐
- (笔记)Linux中的终端、控制台、tty、pty
1>tty(终端设备的统称): tty一词源于teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘阅读和发送信息的东西,后来这东西被键盘与显示器 ...
- e816. 创建工具栏
A toolbar can be either horizontal or vertical. When the orientation is horizontal, the objects in t ...
- e741. 将标签的焦点置于关联的文本框上面
This example associates a label with a text field using setLabelFor(). A mnemonic is set on the labe ...
- (转)LCD:LCD常用接口原理篇
关键词:android LCD TFT TTL(RGB) LVDS EDP MIPI TTL-LVDS TTL-EDP平台信息:内核:linux2.6/linux3.0系统:android/a ...
- install sun-java6-jdk in ubuntu12.04
http://blog.sina.com.cn/s/blog_6296abc601018p86.html 在文件/etc/apt/sources.list 的最后添加下面的源: deb http:// ...
- u3d资源打包只能打包场景材质,不能打包脚本
GameObject附带脚本打包进来以后,只有一个脚本名字,估计只是关联了脚本,内容却不在,所以后面打包资源的话,一定要把脚本,shader之类的,放到工程目录下
- 关于js中namespace命名空间模式
命名空间有助于减少程序中所需要的全局变量的数量,并且同时有助于避免命名冲突或过长的名字前缀. 关于命名空间的例子: /** * 创建全局对象MYAPP * @module MYAPP * @title ...
- Websphere下删除某个文件(ibm-partialapp-delete.props)
Websphere下删除某个文件(ibm-partialapp-delete.props)
- 【LFM】隐语义模型
模型解释: http://blog.csdn.net/harryhuang1990/article/details/9924377
- 怎么使用ABBYY中的Bates编号
ABBYY PDF Transformer+ 可让您将 Bates 编号添加到 PDF 文档.Bates 编号可方便文档搜索和检索,并更加有利于电子归档.下面小编给小伙伴们讲讲ABBYY PDF Tr ...