一、Lua数据类型汇总
- Lua语言是一种动态类型语言,在这种语言中没有类型定义,每个值都带有其自身的类型信息
- Lua有8种基本类型:
- nil:空
- boolean:布尔
- number:数值
- string:字符串
- userdata:用户数据
- function:函数
- thread:线程
- table:表
- 使用type()函数可以获取一个值对应的类型名称,该函数的返回值为string类型:
type(nil)
type(true)
type(10.4*3)
type("Hello world")
type(io.stdin)
type(print)
type(type)
type({})
type(type(X))
- 变量没有预定义的类型,任何变量都可以包含任何类型的值:
- 一般情况下,将一个变量用作不同类型时会导致代码的可读性不佳;但是,在某些情况下谨慎地使用这个特性可能会带来一定程度的便利。例如,当代码发生异常时可以返回一个nil以区别于其他正常情况下的返回值
二、nil
- nil是一种只有一个nil值的类型,它的主要作用就是与其他所有值进行区分。Lua语言使用nil来表示无效值(即没有用的值)的情况
- 像之前介绍的,一个全局变量在第一次被赋值前的默认值就是nil,而将nil赋值给全局变量则相当于将其删除
三、boolean
- boolean类型具有两个值:true和false
Lua中的条件测试
- 在Lua中,boolean值并非用于条件测试的唯一方式,任何值都可以表示条件
- Lua中,条件测试把false和nil视为假,将除了false和nil之外的所有其他值视为真(特别的是,在条件检测中Lua语言把0和空字符串也视为真)
Lua逻辑运算符
- Lua支持常见的逻辑运算符:and、or、not
- and运算符的结果为:如果第一个操作数为false,则返回第一个操作数;否则返回第二个操作数
- or运算符的结果为:如果第一个操作数为true,则返回第一个操作数;否则返回第二个操作数
- not运算符的结果为:返回操作数的相反值(true or flase)
- 例如,下面是and和or的用法
4 and 5 nil and 13 false and 13 0 or 5 false or "hi" nil or false
- 例如,下面是not的用法
not nil not false -- 注意, 0也是真 not 0 not not 1 not not nil
and和or都遵循短路求值:
即只在必要时才对第二个操作数进行求值
例如,下面的表达式不会发生运行时异常,因为当i等于0时,a/i不会执行
i ~=0 and a/i > b
- 下面的表达式非常有用:即当x未被初始化时,将其默认值设为v(假设x不是boolean类型的false)
x=x or v -- 上面的表达式等价于 if not x then x = v end
- 另一种有用的表达式类似于"(a and b) or c"或者"a and b or c"(and的优先级高于or,所以括号可以去掉):
- 当b不为false时,它们等价于C语言的三目运算符a?b:c
- 例如我们可以使用表达式(x>y) and x or y选出x和y中较大的一者
四、数值类型
五、字符串类型
六、表类型
七、userdata
- userdata类型允许把任意的C语言数据保存在Lua语言变量中
- 在Lua语言中,用户数据类型除了赋值和相等性测试外,没有其他预定义的操作
- 用户数据被用来表示由应用或C语言编写的库所创建的新类型。例如,标准I/O库使用用户数据来表示打开的文件
- 在后面介绍C API的时候会讨论更多的相关内容
八、附加
- 其他数据类型在后面介绍