2.5 Lua数据类型
数据类型在任何的计算机语言中都比较重要。Lua是动态类型,类似于JavaScript,变量类型的确定是在赋值时进行,而不是在声明的时候。
2.5.1 数据类型
Lua数据类型可以分为:数值类型(number)、布尔类型(boolean)、字符串类型(string)、自定义类型(userdata)、函数类型(function)、线程(thread)、表类型(table)和空值(nil)。
1.数值类型
数值类型可以保存实数,包括整数和浮点数,整数可以是十进制和十六进制,由一串数字序列组成。如果是0x开始则表示是一个十六进制数。
浮点数必须包含一个数字、一个小数点或“e”(或“E”)。浮点数例子如下:3.1415、-3.1E12、0.1e12和2E-12。
2.布尔类型
布尔类型有两种值:true和false。
3.字符串类型
字符串是若干封装在双括号(")或单括号(')内的字符。字符串示例如下:
"fish" 'fish' "5467" "a line"
4.自定义类型
在Lua中可以通过自定义类型与C进行交互,通过自定义类型可以将任意的C语言数据存储到Lua变量中。
5.函数类型
在Lua中函数可以作为一种数据类型使用,函数可以赋值给一个变量,函数可以作为参数传递给其他的函数。
6.线程类型
表示一个线程,线程可以同时执行多个,每个线程拥有自己独立的栈、局部变量和指令指针。
7.table类型
table类型实现了一组关联数组类型。table类型是使用{}表示的,table类型示例如下:
local point ={x= 10, y= 20} print(point["x"]) --采用下标方式访问 print(point.y) --采用字典方式访问
8.nil
nil是Lua中的特殊类型,表示没有任何有效值的情况。在变量没有被赋值以前默认值是nil,如果变量被赋值为nil则Lua的垃圾收集器会删除该变量,释放它所占用的内存。
2.5.2 type函数
函数type可以返回定变量或数值的类型。示例代码如下:
print(type("Hello Lua")) print(type(100)) print(type(100.0)) print(type(true)) print(type(print)) print(type(nil)) print(type({x= 10, y= 20}))
输出结果如下:
string number number boolean function nil table
2.5.3 数据类型转换
Lua提供了类型转换函数,这些转换包括:转换成字符串和转换成数字等。
1.转换成字符串
我们可以将布尔类型和数值类型转换为字符串类型,tostring()函数布尔类型和数值类型都有tostring()函数实现转换。示例代码如下:
local found = false print(tostring(found)) --输出"false" local num1 = 10 local num2 = 10.0 local num3 = 10.01 print(tostring(num1)) --输出"10" print(tostring(num2)) --输出"10" print(tostring(num3)) --输出"10.01" local tb = tonumber({x= 10, y= 20}) ① print(tostring(tb)) --输出nil
第①行代码是试图将table类型转换为数值类型,结果是nil。
2.转换成数字
把非数字的原始值转换成数字的函数tonumber()。示例代码如下:
local num = tonumber("10") --返回 十进制数 10 local num = tonumber("AF",16) --返回 十六进制数 175 ① local num = tonumber("0xA") --返回 10 ② local num = tonumber("56.9") --返回 56.9 local num = tonumber("0102") --返回 102 local num = tonumber("12345red") --返回 nil ③ local num = tonumber("red") --返回 nil ④ local num = tonumber(true) --返回 nil ⑤ local num = tonumber({x= 10, y= 20}) --返回 nil ⑥
上述代码第①行将字符串"AF"转换为十六进制数值,tonumber函数有两个参数,第二个参数是基数,基数表示数值的进制。
第②行代码将字符串"0xA"转换为十进制数值,tonumber函数默认基数是十进制。
第③~⑥行代码返回nil表示无法转换有效的数值。从第⑤行代码可见,布尔类型不能转换为数值类型;从第⑥行代码可见,table类型也不能转换为数值类型。