• Lua 是一个动态类型的语言。
    • 变量无类型定义;只有数值由类型
      • int a = 1; (对比 Java)
    • 该语言中没有类型定义,所有值都必定有自己的类型。
  • Lua 中所有的数值都是“第一梯队”值。
    • 所有的数值可以被存储进变量
    • 被当作是参数传递给其他函数并作为结果返回

8 种基本类型

1. nil

  • nil 类型表示一种没有任何有效值,通常用于没有赋值的变量
  • 将全局变量和table指定为nil类型具有删除作用,等同于将他们删除 ```lua a = 10 print(a)

a = nil print(a)

  1. ```lua
  2. tempTable{key1 = "val1", key2 = "val2", "val3"}
  3. for k,v in pairs(tempTable) do
  4. print(k.."---"..v)
  5. end
  6. tempTable.key1 = nil
  7. for k,v in pairs(tempTable) do
  8. print(k.."---"..v)
  9. end
  • nil 进行比较时,需要加上双引号

    print(type(a))
    if(type(a) == "nil")
    then
    print("---nil---")
    end
    

    2. boolean

  • 只有两种数值:true 和 false

    • 进行判断的时候,false 和 nil 都会使条件变为 false。
      if false or nil
      then
      print("false or nil 其中有一个为 true")
      else
      print("false and nil 都为 false")
      end
      

      3. number

      1. integer number

  • 标准 Lua 使用 64-bit 整数

  • 对小型电脑和嵌入式系统可以使用 32-bit 整数
  • 正常来讲,在操作整数时,在操作整数值时,任何溢出都会按照双补算术的通常规则进行循环。

    • 实际结果是唯一的,可表示的,整数值。
    • 等于对 2^n 取模得到的结果,n 是整数类型的位数。

      2. real number (floating-point)

  • 标准 Lua 使用 64-bit 浮点数

  • 对小型电脑和嵌入式系统可以使用 32-bit 浮点数

  • Lua对于每个子类型何时使用有明确的规则,但它也会根据需要自动在它们之间进行转换。

    4. string

  • Lua 的 字符串表示不可变的字符序列。

  • string 可以包含任意 8-bit 数值,包括嵌入式0
    • ‘\0’ 在Lua中不是终止符
    • 可以将任意字节加载到字符串中(图像、音频、视频、本机代码等),
    • 并且不会冒着被某些库函数在第一个’\0’处截断的风险
    • 如果在 C 语言中用 ‘\0’ 处理与字符串相关的函数会发生风险
  • The length of any string in Lua must fit in a Lua integer.
  • string数组大小:int -2^63+1 ~ 2^63-1 (亲测)

    array = {"Lua", "Tutorial"}
    for i = -9223372036854775807,-9223372036854775806 do
    -- for i = 9223372036854775807,-9223372036854775808 do
    print(array[i])
    end
    

    5. function

  • Lua 既可以用 Lua 写好的函数,也可以用 C语言写好的函数。

  • 两者都由类型函数表示。

    6. userdata

  • 提供userdata 类型是为了能够让 C 语言中的数据存储在 Lua 语言的变量中。

  • userdata 值表示一个原始内存块。
    • full userdata
      • 一个由 Lua 管理的内存块。
    • lighut userdata
      • 一个 C 语言指针
  • userdata 没有预定义操作,除了身份测试和赋值。
  • 通过使用metatables (元表),可以为完整的userdata值定义操作。
  • userdata的值只能通过C的API创建和修改,不能通过Lua来操作。

    • 保证了主程序和 C 库所拥有的数据的完整性。

      7. thread

  • thread代表独立的执行线程,它被用来实现协程。

  • Lua线程与操作系统线程无关。
  • Lua支持所有系统上的协程,即使是那些不支持原生线程的系统。

    8. table

  • table 类型是 Lua 中唯一的数据结构机制

    • 数组 array
    • 列表 list
    • 符号表 sumbol table
    • 集合 set
    • 记录 record
    • 图 graph
    • 树 tree
    • 为了表示记录,Lua使用字段名作为索引。
  • table 是异构的,不仅可以有数字作为索引,还可以有除nil和NaN之外的任何Lua值作为索引。

  • NaN, (not a number) 表示未定义数值结果的特殊浮点值,0/0。
  • 任何与值nil相关联的键都不被认为是表的一部分。相反,任何不属于表的键都有一个关联值nil。
  • 语法糖
    • a.name -> a[“name”]
  • 与索引一样,表字段的值可以是任何类型的。特别地,因为函数是一类值,所以表字段可以包含函数。因此,表也可以携带方法。
  • 表的索引遵循语言中原始相等的定义。
  • a[i] = a[j](在没有元方法的情况下相等),表示同一个表元素。
  • 整型值浮点数等于其整数。
  • 任何用作键的浮点数都将被转换为该整数。
    • a[2.0] = true,key -> 2 而非 2.0
  • 表、函数、线程和(完整的)userdata值都是对象
    • 变量实际上不包含这些值,只包含对它们的引用。赋值、参数传递和函数返回总是操作对这些值的引用;这些操作并不意味着任何形式的复制。
  • 标准库函数类型返回一个描述给定值类型的字符串。