lua是一种动态类型的语言。
在lua中有8中基础类型:nil(空)、boolen、number、string、userdata(自定义类型)、function、thread、table。函数type可根据一个值返回其类型名称,其返回值为string。
print(type("hello world")) -->string
print(type(10.4 * 3)) -->number
print(type(type)) -->function
print(type(true)) -->boolen
print(type(nil)) -->nil
print(type(type(x)) -->string
注意在lua中,函数是作为“第一类值”来看待的,所以可以像操作其他值一样来操作一个function。
nil是一种类型,它只有一个值nil,它的主要功能是用于区别其他任何值。
boolen类型有两个可选值:false,true。
在lua中任何值都可以表示一个条件。Lua将false和nil视为false,其他所有的值均视为true,特别注意,数字0和空字符串也都视为true。
number用于表示实数。Lua中没有整数类型,其使用双精度来表示一个整数,因此其可以精确表示任何32位的整数,而不会出现“四舍五入”的情况。所以Lua中的整数运算是准确的,但是要注意的是,如果整数运算中牵扯到小数,则结果就会变得不再准确,可能存在误差,如下:
local a =0.1 * 0.1 * 10000
local b = 10000
print(b%a) -->99.999999(输出并不为0)
Lua支持科学计数法:
4.57e-3, 0.3e12
Lua中的字符串通常表示“一个字符序列”。Lua完全采用8位编码,Lua字符串中的字符可以具有任何数值编码,包括数字0,也就是说,可以将一个任意二进制数据存储在一个字符串。
Lua的字符串是不可变的值,不能像在c语言中直接修改字符串的某个字符,而是应该根据修改要求创建一个新的字符串。
Lua自动管理字符串的内存,Lua能够高效的处理长字符串。
Lua中有与c语言类似的转义序列,如“\n””\t”。
在Lua中,还可以用一对匹配的双方括号来界定一个字母字符串,就像写块注释一样,这样形式书写的字符串可以延伸多行,Lua不会解释其中的转义序列。此外,如果字符串的第一个字符是换行,那么Lua会忽略它,这种写法对于含程序代码的字符串尤为有用,比如html,如下:
page=[[
<html>
<head>
<title>An HTNL Page<title>
head>
<body>
<a herf="http://www.lua.org">Luaa>
body>
html>
]]
write(page)
有时字符串中需要包含这样的内容:a=b[c[i]]
page = [[a= b[c[i]]]] -->这样方括号匹配会发生错误
为了解决这种情况,可以在两个左方括号间加任意数量的等号,则字符串只用在遇到含有等量数量等号的右方括号时才会结束。这套机制同样适用于注释。
page = [==[a=b[i]]]==]
Lua提供了运行时的数字与字符串的自动转换。在一个字符串上应用算数操作时,Lua会尝试将其装换为一个数字:
print("10" + 1) -->11
print(10 + 1") -->10 + 1
print("hello" + 1) -->错误,“hello world”不能转换为数字
相反,在Lua期望字符串的时候,它也会将数字转换为字符串:
print(10 .. 20) -->1020
“..”为字符串连接符,要注意的是直接在一个数字后面使用字符串连接符,必须要用一个空格分割它们,否则,Lua会将第一个点理解为小数点。
在日常使用中,最好不要依赖于上述两种隐式转换,有时我们可以使用显式转换如tonumber(将字符串转换为number,如果转换失败,则返回nil)以及tostring(将一个number转换为string)
在Lua5.1中,可以在字符串前放置“#”来获取字符串的长度:
a = "hello"
print(#a) -->5
table类型实现了“关联数组”,在Lua中,可以通过除nil以外的所有值来索引table。此外table没有固定大小。基于table,可以以一种简单、统一、高效的方式表示数组、符号表、集合、记录、队列等数据结构。另外,Lua也是通过table来表示模块(module)、包(package)和对象(object)的。
在Lua中,table既不是值也不是变量,其是对象。table永远是匿名的,一个持有table的变量实际是一个引用,其与table自身之间没有固定的关联性。
a = {}
a["x"] = 10
b = a -->b与a引用了同一个table
print(b["x"]) -->10
当一个程序再也没有对一个table的引用时,Lua的垃圾收集器最终将删除该table,并复用它的内存。
当table中某个元素没有初始化时,它的内容为nil。
table为字符串索引提供了一种简便的语法糖,即a[“x”]等价于a.x。要特别注意a.x,a[x],a[“x”]这三者的区别,a.x是与a[“x”]等价而不是a[x]。
a = {}
x = "y"
a[x] = 10
print(a.x) -->nil (等价于a["x"])
print(a.y) -->10(等价于a["y"])
print(a[x]) -->10(由于x = "y", 故a[x]等价于a["y"])
对Lua的习惯而言,数组通常以1作为索引的起始值。Lua5.1中,长度操作符用于返回数组或者线性表中的最后一个索引值。
要注意的是#号并不一定返回一个数组的长度,因为所有未初始化的元素的索引结果都是nil,Lua将nil作为界定数组结尾的标志,当一个数组中间有nil值时,长度操作符会将这些nil元素视为数组的结尾标记。可以使用table.maxn,它将返回一个table的最大正索引值。
a = {1, 2, 3, 4, 5, 6}
a[10] = 10
print(#a) --> 6
print(table.maxn(a)) --> 10
在第六章详细介绍
userdata可以将任意c语言数据存储在Lua变量中,在Lua中这种类型没有太多的预定义操作, 只能进行赋值和相等性测试。
thread将在第九章解释。