L03. 数据类型
一. 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类型
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了