类型与值
lua是一种动态类型的语言,在语言中没有类型定义的语法,每个值都携带了它自身的类型信息
lua中有8种基础类型
nil
只与自身相等assert(nil==nil),空值
boolean
true
false
nil和false是假,其它都是真,0和""都是true
number
浮点实数,没有使用整数
string
8位编码也就是个char
可以包含任何字符,包括\0,很象stl里的string类,可以当二进制流看待
string.len和#返回的是实现长度,不以\0为结束标记
不可以修改字符串变量内容,只能重新赋值
lua能高效的处理大字符串,不用怀疑lua字符串的处理能力
特殊字符与c一样,如换行是\n tab是\t
多行字符串定义[[ ]]
\<ddd>一至三个数据表示字符,ASCII码
在字符串上使用数学运算会先前字符串转换成数字
".."是字符串连接操作符"wang".."ning"
在数字后使用字符串连接操作符".."时,要有一个空格,不然会认为是小数点
尽量不要依赖lua的自动类型转换,可以使用tostring,tonumber手动转
userdata
一块由c向lua申请的内存,存在lua里,申请者自行解析
function
lua中的函数是作为”第一类值“,可以随意赋给一个变量
thread
协同线程lua没有真正的多线程,他都是串行执行的,生产者消费者模式
只能自己停止自己
可以使用守护线程来在多个协同线程中通过状态判断来模拟多线程的环境
table
lua里唯一的一种数据结构
lua里的module package object都是用table实现的
table是一个对象,所有对他的
可以表示出多种数据结构
数组
可以不写key添加数据如:t={1,2,3,4}
自动定义从下标1开始顺序向后加一
所有没有显示声明key的项都是自动生成数组下标的
lua里与c不一样的地方就是一标都人1开始,一定记住
t={"a", 2="b", "c", 4=1, 2, 6=3}
t[1] = "a"
t[2] = "c"
t[3] = 2
t["2"] = "b"
t["4"] = 1
t["6"] = 3
后面三项不再是数组而是hash表
使用#可以得到数组长度,但要求所有下标是从1开始连续的
t={}
t[1] = 1
t[100] = 100
的长度是1,因为它以找到nil的值为结束,以上的定义方式数组断了
二维数组就是table套table
t={ {100,200}, {300,400}}
t[1][1] = 100
t[1][2] = 200
t[2][1] = 300
t[2][2] = 400
链表
t1 = {p=t3, v="value", n=t2}
t2 = {p=t1, v="value", n=t3}
t3 = {p=t2, v="value", n=t1}
环形链表
hash表
队列
栈
可以使用lua中的任何类型作key和value,除nil不能当key,当value是删除
只能显示的声明一个table,t = {}
添加数据
t = {"a","b","c",1,2,3}
t={1="a",2="b",3="c",4=1,4=2,6=3}
以上两人个定义不相等,显示声明时字符串类型的key可以不写双引号
t[1] = "a"
t[2] = "b"
t[3] = "c"
t[4] = 1
t[5] = 2
t[6] = 3
这个与第一个相同
t["1"] = "a"
t["2"] = "b"
t["3"] = "c"
t["4"] = 1
t["5"] = 2
t["6"] = 3
这个与第二个相同
t={x="lua"}
t={} t.x="lua" t["x"] = "lua"
使用type函数可以返回一个可以显示的字符串