初识Lua
一、前言:你可能早已“用过” Lua!
虽然你没写过 Lua 代码,但很可能已经和它打过交道:
- 🎮 《魔兽世界》插件:用 Lua 编写
- 🌐 Nginx + OpenResty:用 Lua 处理高并发请求
- 🔑 Redis 原子操作:通过 Lua 脚本实现
Lua 是一门极简、高效、可嵌入的脚本语言,设计哲学是:“小而美,快而稳”。
本文将带你10 分钟快速认识 Lua,无需任何前置知识!
二、Lua 是什么?为什么这么火?
2.1 基本信息
- 诞生时间:1993 年(巴西里约热内卢天主教大学)
- 名字含义:葡萄牙语 “月亮”(Moon)
- 定位:嵌入式脚本语言(不是独立应用开发语言)
2.2 核心特点
| 特性 | 说明 |
|---|---|
| ✅ 超轻量 | 解释器仅 200KB~300KB |
| ✅ 高性能 | JIT 编译(LuaJIT)速度接近 C |
| ✅ 易嵌入 | C API 极简,可轻松集成到任何系统 |
| ✅ 语法简洁 | 全语言只有 20 多个关键字 |
💡 一句话总结:Lua 不是用来写大型系统的,而是给现有系统加“智能脚本”的胶水语言。
三、第一个 Lua 程序:Hello World!
3.1 安装 Lua(可选)
- Windows:下载 Lua for Windows
- macOS:
brew install lua - Linux:
sudo apt install lua5.4
3.2 编写 hello.lua
-- 这是我的第一个 Lua 程序! print("Hello, Lua!")3.3 运行
lua hello.lua # 输出:Hello, Lua!🎉 恭喜!你已经迈出了第一步!
四、Lua 语法速览(对比 Python)
4.1 变量与类型
Lua 是动态类型语言,变量无需声明:
name = "Alice" -- 字符串 age = 25 -- 数字(整数和浮点统一) is_ok = true -- 布尔值 nothing = nil -- 空值(相当于 Python 的 None)⚠️ 注意:Lua 中只有nil和false是“假”,其他都是“真”(包括 0 和空字符串)!
4.2 表(Table)—— Lua 的万能数据结构
Lua 没有数组、字典、对象,只有 table!
-- 当作数组(注意:索引从 1 开始!) fruits = {"apple", "banana", "orange"} print(fruits[1]) --> apple -- 当作字典(哈希表) person = {name = "Bob", age = 30} print(person.name) --> Bob -- 混合使用 data = { "first", name = "mixed", 42 }🔑 核心概念:table 是 Lua 唯一的复合数据类型,也是面向对象的基础。
4.3 控制结构
if 判断
if age >= 18 then print("成年人") else print("未成年人") endfor 循环
-- 数值循环(推荐) for i = 1, 5 do print(i) -- 输出 1,2,3,4,5 end -- 遍历 table for key, value in pairs(person) do print(key, value) end4.4 函数
function greet(name) return "Hello, " .. name .. "!" -- .. 是字符串拼接 end print(greet("World")) --> Hello, World!4.5 局部变量(重要!)
local x = 10 -- 局部变量(作用域仅当前 block) y = 20 -- 全局变量(不推荐)✅ 最佳实践:始终用 local 声明变量,避免污染全局环境!五、Lua 在 Redis 中的应用(重点!)
Redis 内置 Lua 引擎,用于执行原子性复杂操作。
5.1 为什么需要 Lua?
- 多条命令无法保证原子性(如:先查库存,再扣减)
- 网络往返多次,性能差
5.2 基本用法:EVAL 命令
EVAL "return redis.call('GET', KEYS[1])" 1 mykey5.3 脚本中的两个关键变量
KEYS:传入的 key 列表(从 1 开始索引)ARGV:传入的参数列表
-- 示例:原子扣减库存 local stock = redis.call('GET', KEYS[1]) if tonumber(stock) >= tonumber(ARGV[1]) then redis.call('DECRBY', KEYS[1], ARGV[1]) return 1 else return 0 end✅ 优势:整个脚本在 Redis 中原子执行,无并发问题!
六、Lua 的局限性
- ❌ 不适合开发大型应用
- ❌ 标准库较弱(需依赖宿主环境)
- ❌ 在 Redis 中不能有随机行为(如
math.random()需固定种子)
💡 记住:Lua 是“嵌入式脚本”,不是“通用编程语言”。
七、学习资源推荐
| 资源 | 说明 |
|---|---|
| 📚 《Programming in Lua》 | 官方权威教程(免费在线版) |
| 🧪 Lua 在线运行 | 无需安装,直接练习 |
| 🐟 Lua 教程(菜鸟教程) | 中文入门首选 |
八、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!