Lua中的数据类型
注释
单行注释 : -- 注释内容
多行注释 : --[[ 注释内容 ]]
数据类型
Lua是动态类型语言 , 变量无需指定数据类型 , 只要赋值即可 .
Lua的基本数据类型汇总
数据类型 | 描述 |
---|---|
nil | 空 . 代表一个无效值 , 可视为 null 和 false |
boolean | 布尔类型 . 值有 true 和 false |
number | 数字 . 就是double |
string | 字符串 . 用一对单引号或双引号包围 |
fuction | 函数 . 由C或Lua编写的函数 |
userdata | 自定义类型 . 表示任意存储在变量中的C数据结构 |
thread | 线程 . 表示执行的独立线程 |
table | 表 . 本质是一个关联数组(associative arrays) |
示例 (Code/secondLua/simpleTest.lua)
1 | -- 数据类型测试 |
输出
nil (空)
nil
类型表示空值 , 若输出一个没有被赋值的变量 , 则会输出 nil
.
对于全局变量和 table
, nil
还有一个删除功能 : 为一个全局变量或 table
赋值 nil
相当于删除该变量 .
示例 (Code/secondLua/nilTest.lua)
1 | tab1 = {key1 = "val1", key2 = "val2"} |
输出
boolean (布尔)
在Lua中 , false
和 nil
表示假 , 其余的值(包括0)都表示真 .
示例 (Code/secondLua/booleanTest.lua)
1 | print(type(true)) |
输出
number (数字)
Lua中所有数字默认都属于double类型 , 可以在luaconf.h中修改默认类型 .
string (字符串)
可以使用一对单引号或双引号表示一行字符串 , 也可以用两个方括号[[ 字符串 ]]
来表示多行字符串 .
字符串之间使用 ..
符号进行连接 . 使用 #
可对字符串计算长度 , 放在字符串前 .
当 string
与其他类型数据进行连接时 , Lua会尝试将其他数据类型都转换为 string
.
当对 string
进行算数操作时 , Lua会尝试将其转换为 number
类型 .
示例 (Code/secondLua/stringTest.lua)
1 | print("2" + 6) |
输出
table (表)
粗浅的理解可以将table视作 array 与 map 的合体 .
在Lua中 , table
通过”构造表达式”来完成 , 例如{}
用来创建一个空表 , 也可以在里面添加数据初始化表 .
Lua的表不同于其他语言的数组 , 其索引从1开始 , 且不固定长度 , 且表内元素可不同类型.
table
实际上是一个”关联数组”(associative arrays) , 数组的索引可以是数字或者是字符串 .
table的索引
对于table的索引有两种方式 :
table[key]
– 针对所有索引类型都可用table.key
– 当索引类型是字符串时的简化写法
使用 #
可对table计算元素个数 , 放在变量名前 .
示例 (Code/secondLua/tableTest.lua)
1 | -- 创建一个空table |
输出
function (函数)
在Lua中 , 函数被视为变量(第一类值) .
说明函数可以在变量之间赋值传递 , 也可以通过匿名函数(不指定函数名)的方式作为参数传递 .
示例 (Code/secondLua/functionTest.lua)
1 | -- 定义函数 |
输出
thread (线程)
在Lua中 , 最主要使用的并发方式是协程(coroutine) .
携程与线程类似 , 有自己的栈 , 局部变量 , 指令指针 , 与其他携程共享全局变量等 .
区别 : 线程可同时运行多个 , 而协程同时只能运行一个 , 处于运行状态的携程只有被挂起(suspend)时才暂存 .
userdata (自定义类型)
userdata是一种用户自定义数据 , 用于表示一种由应用程序或C/C++库所创建的类型 .
可以将C/C++的任意数据类型的数据(通常是struct 或 指针)存储到Lua变量中调用 .