查看: 21|回复: 0

lua变量定义

[复制链接]

47

主题

53

回帖

1551

积分

金牌会员

积分
1551
发表于 2026-5-25 16:26:10 | 显示全部楼层 |阅读模式
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。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表