概述
如果要更全面的学习Lua语言,可以查阅下面文档:
- Lua程序设计(PIL):lua作者写的一本书,是学习lua的不二之选。
- Lua参考手册5.3版:lua的使用手册。
基础数据类型
lua一共有8种基本的数据类型:nil, string, number, boolean, table, function, thread, userdata
。
其中nil表示没有值,和其他类型都不相等,在条件判断中只有nil和false表示否定。
string是字符串类型,它本质上是一个字节序列,也就是它说可以存储任意数据,5.3以后增加了utf8的函数库,使用它可以对utf8字符串作正确的处理。
number代表数值类型,在5.3以前是没有整型的,5.3以后加上了整型作为number的子类型,使用math.type
判断一个数值是整型还是浮点数。
boolean代表布尔值,很早期的lua版本中并没有boolean类型,boolean类型的出现,大概是为了解决table中空值的问题。
table是唯一的数据结构
table是lua唯一的数据结构,其他结构都可以用table实现,它不仅可以用数值作索引,也可以用其他类型(比如字符串,函数,甚至另一个table),lua内部用一个数组和一个哈希表来实现table。这使得table非常强大,即可以用作字典,也可以用作数组,配合元表机制还可以模拟面向对象。lua的很多基础设施,比如模块,全局变量,元表,都是基于table实现的。在语言层面它是如此简洁,可又能实现无比强大的功能。
table的简单声明:
-- 当成字典使用
local t = {
a = 1,
b = true,
c = "haha",
}
-- 当成数组使用
local t2 = {
1, "aa", false}
table甚至可以同时表示字典和数组:
local t3 = {
1, 2, 3,
a = "aaa",
b = "bbb",
}
实际上他们可以使用通用的格式来表示 :
local t3 = {
[1] = 1,
[2] = 2,
[3] = 3,
["a"] = "aaa",
["b"] = "bbb",
}
但在实践中,我们最好不混用字典和数组,这常常会引发混乱的问题。而从设计的角度看,我认为它违反了单一职责原则。比如空Table就且有二义性,如果我们有一个需求,要将空Table转换成JSON格式,此时JSON库就不知道如何处理了,因为它不知道要转成空数组还是空对象,cjson默认