|
lua声明变量是不需要声明类型的,并且声明之后后期也可以修改类型,这一点和python是类似的
Lua复制代码
--这是注释--直接定义的是全局变量a = 1b = "fengfeng"c = 'zhidao' -- 单引号也可以d = truee = falsef = { 1, 2, 3 } -- 数组g = { name = "fengfeng", age = a } -- 表--也可以这样批量赋值h, i, j = "a", 2, false--使用print打印,type显示类型print("a", a, type(a))print("b", b, type(b))print("c", c, type(c))print("d", d, type(d))print("e", e, type(e))print("f", f, type(f))print("g", g, type(g))print("h i j", h, i, j)--动态改类型也是可以的a = "zhangsan"print("a", a, type(a))局部变量使用local关键字声明局部变量,局部变量的作用范围是当前的代码块
Lua复制代码
do --这是代码块 local a = 1 print("a", a)endprint("a", a) -- 打印为nil数组Lua 无原生数组,通过 table + 数字索引 模拟,默认索引从 1 开始 # 符号的局限性:仅对 “连续数字索引” 有效,非连续数组需手动计算长度
Lua复制代码
local array = {"A", nil, "B", "C", "D", 1, 2, 3, 4}print(array, type(array)) -- tableprint(array[1]) -- Aprint(array[-1]) -- 访问不存在的索引,nil-- 获取数组长度print(#array)print(array[#array]) -- 4--遍历数组-- 方式1:按索引遍历(推荐,可控)for i = 1, #array do print(i, array)end-- 方式2:用 pairs 遍历(会遍历所有键值对,包括非连续索引) 遇到nil 跳过for k, v in pairs(array) do print("pairs 键:" .. k .. ",值:" .. v)end-- 方式3:用 ipairs 遍历(只遍历连续的数字索引,从 1 开始) 遇到nil breakfor k, v in ipairs(array) do print("ipairs 键:" .. k .. ",值:" .. v)end表这是 Lua 最核心、最强大的数据结构 ——Lua 里几乎所有复杂数据类型(数组、字典、对象等)都是基于 table 实现的 table 是一种键值对(key-value) 集合,类似 Python 的字典(dict),但比字典更灵活: - 键(key)可以是除 nil 外的任意类型(数字、字符串、布尔、甚至另一个 table);
- 值(value)可以是任意类型(数字、字符串、函数、table 等);
- table 是动态的,可随时添加 / 删除键值对;
- table 是引用类型(赋值、传参时传递的是地址,而非拷贝)。
定义table
Lua复制代码
-- 方式1:空 tablelocal t1 = {}-- 方式2:初始化键值对(推荐)-- ① 隐式键(数字索引,默认从 1 开始,对应之前讲的数组)local t2 = {"Lua", "Python", "Java"} -- 等价于 t2[1]="Lua", t2[2]="Python", t2[3]="Java"-- ② 显式键(任意类型)local t3 = { name = "张三", -- 等价于 t3["name"] = "张三"(字符串键) age = 20, -- 数字值 is_student = true, -- 布尔值 [100] = "分数", -- 数字键(显式写法) ["hobby-list"] = {"读书", "运动"} -- 字符串键(含特殊字符)+ 值为 table}-- ③ 混合键(数组 + 字典)local t4 = { 10, 20, 30, -- 隐式数字键:1、2、3 name = "李四", -- 显式字符串键 [false] = "布尔键" -- 显式布尔键}访问table元素
Lua复制代码
local t = {name = "张三", age = 20, [1] = "hello"}-- 访问方式1:点语法(仅适用于 字符串键且符合标识符规则,如字母/数字/下划线)print(t.name) -- 输出:张三print(t.age) -- 输出:20-- print(t.1) -- 报错!点语法不能用于数字键-- 访问方式2:方括号语法(通用,适用于所有键类型)print(t["name"]) -- 输出:张三print(t[1]) -- 输出:helloprint(t["age"]) -- 输出:20-- 访问不存在的键,返回 nilprint(t.gender) -- 输出:nil修改table元素
Lua复制代码
local t = {name = "张三"}-- 添加新键值对t.age = 20 -- 字符串键t[100] = "满分" -- 数字键t["hobby"] = "跑步" -- 字符串键(显式)-- 修改已有键值对t.name = "李四"print(t.name) -- 输出:李四-- 删除键值对(赋值为 nil)t.age = nilprint(t.age) -- 输出:nil注意事项 - 键的隐式转换:数字键和字符串键是不同的(如 t[1] ≠ t["1"]);
- # 符号的局限性:仅对连续数字索引有效,字典型 table 别用 # 求长度;
- nil 的影响:ipairs() 遇到 nil 会停止遍历,如需 “空元素” 可用 0 / 空字符串占位;
- 引用赋值:避免误以为 t2 = t1 是拷贝,修改 t2 会影响 t1。
|