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类型也不能转换为数值类型。