元素码农
基础
UML建模
数据结构
算法
设计模式
网络
TCP/IP协议
HTTPS安全机制
WebSocket实时通信
数据库
sqlite
postgresql
clickhouse
后端
rust
go
java
php
mysql
redis
mongodb
etcd
nats
zincsearch
前端
浏览器
javascript
typescript
vue3
react
游戏
unity
unreal
C++
C#
Lua
App
android
ios
flutter
react-native
安全
Web安全
测试
软件测试
自动化测试 - Playwright
人工智能
Python
langChain
langGraph
运维
linux
docker
工具
git
svn
🌞
🌙
目录
▶
Lua语言基础
▶
环境搭建
安装Lua解释器
配置开发环境
第一个Lua程序
▶
基本语法
变量与数据类型
运算符与表达式
控制结构
▶
数据结构
表(Table)详解
数组与迭代
字符串处理
▶
Lua高级编程
▶
函数编程
函数定义与调用
闭包与作用域
高阶函数应用
▶
元表与元方法
元表基础
操作符重载
继承与对象系统
▶
协程编程
协程基础
生产者-消费者模式
协程调度实践
▶
Lua应用实践
▶
游戏开发
Lua与游戏引擎集成
AI脚本实现
热更新机制
▶
系统编程
Lua与C交互
扩展库开发
性能优化技巧
▶
实用工具开发
配置文件解析
自动化测试框架
网络编程基础
发布时间:
2025-03-24 12:03
↑
☰
# Lua变量与数据类型 本文将介绍Lua语言中的变量声明和基本数据类型,帮助你理解Lua的类型系统。 ## 变量声明 在Lua中,变量分为全局变量和局部变量: ### 局部变量 使用`local`关键字声明局部变量: ```lua local name = "张三" -- 字符串类型 local age = 25 -- 数字类型 local isStudent = true -- 布尔类型 local score -- 声明但不赋值,默认为nil ``` ### 全局变量 不使用`local`关键字的变量默认为全局变量: ```lua count = 1 -- 全局变量 MAX_VALUE = 100 -- 全局常量(按照惯例使用大写) ``` **最佳实践**:优先使用局部变量,因为: - 访问速度更快 - 不会污染全局命名空间 - 作用域明确,代码更易维护 ## 基本数据类型 Lua是动态类型语言,变量的类型由赋给它的值决定。使用`type()`函数可以获取变量的类型: ### 1. nil `nil`是一个特殊的类型,表示"无"或"空": ```lua local var = nil print(type(var)) -- 输出:nil -- 未赋值的变量默认为nil local empty print(empty) -- 输出:nil ``` ### 2. boolean(布尔) 布尔类型有两个值:`true`和`false`: ```lua local isValid = true local isFinished = false -- 条件判断 if isValid then print("有效的") end ``` **注意**:在Lua中,只有`false`和`nil`被视为假,其他所有值(包括0和空字符串)都被视为真。 ### 3. number(数字) Lua中的数字类型统一使用双精度浮点数表示: ```lua local int = 42 -- 整数 local float = 3.14 -- 浮点数 local sci = 1.2e3 -- 科学记数法 local hex = 0xFF -- 十六进制 -- 数学运算 local sum = 10 + 20 local product = 5 * 3 local quotient = 10 / 3 -- 除法总是返回浮点数 local floor = math.floor(10/3) -- 向下取整 ``` ### 4. string(字符串) 字符串是不可变的字符序列: ```lua -- 字符串声明 local str1 = "双引号字符串" local str2 = '单引号字符串' local str3 = [[多行 字符串]] -- 字符串连接 local name = "Lua" local version = "5.4" local info = name .. " " .. version -- 使用..运算符连接 -- 字符串操作 print(#str1) -- 获取字符串长度 print(string.upper(name)) -- 转换为大写 print(string.format("版本: %s", version)) -- 格式化字符串 ``` ### 5. function(函数) 在Lua中,函数是第一类值,可以存储在变量中: ```lua -- 函数声明 local function add(a, b) return a + b end -- 函数赋值给变量 local calc = add print(calc(10, 20)) -- 输出:30 -- 匿名函数 local multiply = function(a, b) return a * b end ``` ### 6. table(表) 表是Lua中唯一的复合数据类型,可以用作数组、字典、对象等: ```lua -- 作为数组 local array = {10, 20, 30, 40} print(array[1]) -- 输出:10(Lua的索引从1开始) -- 作为字典 local dict = { name = "张三", age = 25, isStudent = true } print(dict.name) -- 输出:张三 print(dict["age"]) -- 输出:25 -- 混合使用 local mixed = { 10, 20, name = "混合表", {x = 1, y = 2} } ``` ## 类型转换 Lua提供了一些基本的类型转换函数: ```lua -- 字符串转数字 local num1 = tonumber("42") -- 42 local num2 = tonumber("3.14") -- 3.14 local num3 = tonumber("abc") -- nil(无效转换) -- 数字转字符串 local str1 = tostring(42) -- "42" local str2 = tostring(3.14) -- "3.14" local str3 = tostring(true) -- "true" -- 自动转换 local num = 42 local str = "数字是" .. num -- 数字在连接时自动转换为字符串 ``` ## 作用域 ### 1. 局部作用域 局部变量的作用域从声明位置开始,到所在语句块结束: ```lua do local x = 10 print(x) -- 可以访问x end -- print(x) -- 错误:x在这里不可见 for i = 1, 3 do local temp = i * 2 print(temp) end -- print(temp) -- 错误:temp在这里不可见 ``` ### 2. 全局作用域 全局变量可以在任何地方访问: ```lua count = 1 -- 全局变量 function increment() count = count + 1 -- 可以访问全局变量 end increment() print(count) -- 输出:2 ``` ## 常见问题解答 ### Q1: 如何检查变量是否已定义? ```lua if myVar ~= nil then print("变量已定义") else print("变量未定义或为nil") end ``` ### Q2: 局部变量和全局变量的性能区别? 局部变量比全局变量访问速度快,因为: - 局部变量存储在寄存器或栈中 - 全局变量需要在全局表中查找 ### Q3: 如何声明常量? Lua没有内置的常量声明,但可以通过约定使用大写命名: ```lua local MAX_VALUE = 100 local PI = 3.14159 ``` ## 下一步 现在你已经了解了Lua的变量和数据类型,可以继续学习[运算符与表达式](/article/lua/basic/operators)来掌握如何操作这些数据。 ## 参考资源 - [Lua 5.4 参考手册](http://www.lua.org/manual/5.4/manual.html#2) - [Programming in Lua](http://www.lua.org/pil/) - [Lua数据类型](http://www.lua.org/pil/2.html)