- Lua 是一个动态类型的语言。
- 变量无类型定义;只有数值由类型
- int a = 1; (对比 Java)
- 该语言中没有类型定义,所有值都必定有自己的类型。
- 变量无类型定义;只有数值由类型
- Lua 中所有的数值都是“第一梯队”值。
- 所有的数值可以被存储进变量
- 被当作是参数传递给其他函数并作为结果返回
8 种基本类型
1. nil
- nil 类型表示一种没有任何有效值,通常用于没有赋值的变量
- 将全局变量和table指定为nil类型具有删除作用,等同于将他们删除 ```lua a = 10 print(a)
a = nil print(a)
```lua
tempTable{key1 = "val1", key2 = "val2", "val3"}
for k,v in pairs(tempTable) do
print(k.."---"..v)
end
tempTable.key1 = nil
for k,v in pairs(tempTable) do
print(k.."---"..v)
end
nil 进行比较时,需要加上双引号
print(type(a)) if(type(a) == "nil") then print("---nil---") end
2. boolean
只有两种数值:true 和 false
标准 Lua 使用 64-bit 整数
- 对小型电脑和嵌入式系统可以使用 32-bit 整数
正常来讲,在操作整数时,在操作整数值时,任何溢出都会按照双补算术的通常规则进行循环。
标准 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 语言指针
- full userdata
- userdata 没有预定义操作,除了身份测试和赋值。
- 通过使用metatables (元表),可以为完整的userdata值定义操作。
userdata的值只能通过C的API创建和修改,不能通过Lua来操作。
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值都是对象
- 变量实际上不包含这些值,只包含对它们的引用。赋值、参数传递和函数返回总是操作对这些值的引用;这些操作并不意味着任何形式的复制。
- 标准库函数类型返回一个描述给定值类型的字符串。