一. Lua语言中共8种数据类型
[1] nil 空。最简单,有且仅有值nil,表示一个无效值(在条件表达式中相当于false)
[2] boolean 布尔。包含两个值:false和true
[3] number 数字。double(双精度)类型(默认类型可以修改 luaconf.h 里的定义)
[4] string 字符串。字符串由一对双引号或单引号或[[ ]]来表示
[5] function 函数。由C或Lua编写的函数
[6] userdata 自定义类型。表示任意存储在变量中的C数据结构
[7] thread 线程。表示执行的独立线程,用于执行协同程序
[8] table 表。Lua中的表(table)其实是一个“关联数组”(associative arrays),数组的索引可以是数字或者是字符串。
在Lua里,table的创建是通过“构造表达式”来完成,最简单构造表达式是{},用来创建一个空表。
二. type(参数),判断数据的数据类型
-[[
type判断类型
语法:
type(参数)
功能:
判断参数的类型
参数:
参数: 任意类型
返回值:
字符串型, "nil", "number", "string", "boolean", "table", "function", "thread", "userdata"返回其中的一个
--]]
print(type("Good Good Study")) --> string
--不管是整型还是双精度浮点型,使用 type() 函数来取其类型,都会返回的是number
print(type(12.34)) --> number
print(type(print)) --> function
print(type({})) --> table
print(type(true)) --> boolean
print(type(nil)) --> nil
print(type(type(X))) --> string
三. nil类型
1. nil类型表示一种没有任何有效值,它只有一个值nil。例如:打印一个没有赋值的变量,结果为nil值
2. 当想要移除一个变量时,只需要将该变量名赋值为nil, 垃圾回收就会会释放该变量所占用的内存
四. boolean类型
1. boolean 类型具有两个值, true 和 false 。 boolean 类型一般被用来做条件判断的真与假,只会将 false 和 nil 视为假,其他的都视为真,特别是在条件表达式中0 和空字符串都会认为是真
print(0 == false) --输出结果: false
if 0 then
print("5 is true") --输出这条语句
else
print("5 is false")
end
--b为nil,nil和false都是不成立
if(0 and b) then
print("0 and b is true")
else
print("0 and b id false") --输出这条语句
end
if "" then
print("nil is true") --输出这条语句
else print("nil is false") end
五. number类型
六. string类型
6. 字符串中的转义字符(下面只是其中一部分)
print("one line\nnext line\n\"in quotes\", 'in quotes'")
print('a backslash inside quotes: \'\\\'')
print("a simpler way: '\\'")
①也可以使用"\"+数值的转义来表示字符, 数值最多由3位数组成
print("\10") --表示换号与\n一样
print("\97\1001") --输出结果: ad1
print("\65\66\100") --输出结果: ABd
②在字符串中转义十六进制数值表示的字符"\"+两个十六进制数,十六进制数值必须由两个且必须是两个十六进制数字组成
print("\x41") --输出结果: A
--在ascll编码的系统中下面的两个表达式是等价的
print("ALO\n123\"")
print('\x41LO\10\04923"')
--把上述字符串全部改为十六进制,来表示字符串中的每一个字符
print('\x41\x4c\x4f\x0a\x31\x32\x33\x22')
③可以使用转义序列\u{h...h}来声明UTF-8字符,花括号中可以支持任意有效的十六进制
print("\u{3b1} \u{3b2} \u{6211}") --输出结果: α β 我
在表示多行[[ ]]的字符串中转义序列不会被转义
⑤\z转义字符,会跳过其后的所有空白字符,直到遇到第一个非空白字符(一行字符串分成两行写)
--下面的代码是换行(一行内容分成两行写但是代码中的效果是一行)
data2 = "\65\z
123"
print(data2) --输出结果: A123(中间不会有换行符)
七. table类型
1. 表的值置为nil,表示移除索引或键名
2. 计算数组长度: "#"和"table.pack"
local a = {1,nil,3,4,key="密钥"}
a["key"] = nil --使用下标方式修改值
a.key = nil --使用字典方式修改值
--当我们定义table a 并设置元素,然后将 a 赋值给 b,则 a 与 b 都指向同一个内存。
--如果 a 设置为 nil ,则 b 也能能访问 table 的元素,因为并没有改变b保存的内存地址。
--如果没有指定的变量指向a,Lua的垃圾回收机制会清理相对应的内存。
local tab1 = {1,2,key=123,[3] = 3,["val"] = 5}
local tab2 = tab1
tab1 = nil
--tab2依然能够访问表,因为只是tab1这个变量改变了,而tab2还是指向的是表的内存地址
for k,v in pairs(tab2) do
print(k,v)
end
--计算数组长度"#"和"table.pack"
print(#{1,2,3,4,5,6}) --仅计算数组长度
local a = table.pack(1,2,3,4,5,6,"我") --打包成数组
print(a.n) --数组长度 n表示这个数组的最大值
八. function类型