初识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 复制代码
-- 这是我的第一个 Lua 程序!
print("Hello, Lua!")

3.3 运行

bash 复制代码
lua hello.lua
# 输出:Hello, Lua!

🎉 恭喜!你已经迈出了第一步!


四、Lua 语法速览(对比 Python)

4.1 变量与类型

Lua 是动态类型语言,变量无需声明:

bash 复制代码
name = "Alice"     -- 字符串
age = 25           -- 数字(整数和浮点统一)
is_ok = true       -- 布尔值
nothing = nil      -- 空值(相当于 Python 的 None)

⚠️ 注意 :Lua 中只有 nilfalse 是"假",其他都是"真"(包括 0 和空字符串)!

4.2 表(Table)------ Lua 的万能数据结构

Lua 没有数组、字典、对象 ,只有 table

bash 复制代码
-- 当作数组(注意:索引从 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 判断
bash 复制代码
if age >= 18 then
    print("成年人")
else
    print("未成年人")
end
for 循环
bash 复制代码
-- 数值循环(推荐)
for i = 1, 5 do
    print(i)  -- 输出 1,2,3,4,5
end

-- 遍历 table
for key, value in pairs(person) do
    print(key, value)
end

4.4 函数

bash 复制代码
function greet(name)
    return "Hello, " .. name .. "!"  -- .. 是字符串拼接
end

print(greet("World"))  --> Hello, World!

4.5 局部变量(重要!)

bash 复制代码
local x = 10  -- 局部变量(作用域仅当前 block)
y = 20        -- 全局变量(不推荐)

最佳实践 :始终用 local 声明变量,避免污染全局环境!


五、Lua 在 Redis 中的应用(重点!)

Redis 内置 Lua 引擎,用于执行原子性复杂操作

5.1 为什么需要 Lua?

  • 多条命令无法保证原子性(如:先查库存,再扣减)
  • 网络往返多次,性能差

5.2 基本用法:EVAL 命令

bash 复制代码
EVAL "return redis.call('GET', KEYS[1])" 1 mykey

5.3 脚本中的两个关键变量

  • KEYS:传入的 key 列表(从 1 开始索引
  • ARGV:传入的参数列表
Lua 复制代码
-- 示例:原子扣减库存
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 教程(菜鸟教程) 中文入门首选

八、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

相关推荐
佩奇大王1 小时前
P159 摆动序列
java·开发语言·算法
Fate_I_C1 小时前
Android现代开发:Kotlin&Jetpack
android·开发语言·kotlin·android jetpack
!停2 小时前
C++基础入门(缺省参数,函数重载,引用)
开发语言·c++·算法
難釋懷2 小时前
Lua语法入门
junit·bootstrap·lua
XiaoLeisj3 小时前
Android Kotlin 全链路系统化指南:从基础语法、类型系统与面向对象,到函数式编程、集合操作、协程并发与 Flow 响应式数据流实战
android·开发语言·kotlin·协程
dapeng28704 小时前
分布式系统容错设计
开发语言·c++·算法
qq_417695054 小时前
代码热修复技术
开发语言·c++·算法
badhope8 小时前
Mobile-Skills:移动端技能可视化的创新实践
开发语言·人工智能·git·智能手机·github
码云数智-园园10 小时前
微服务架构下的分布式事务:在一致性与可用性之间寻找平衡
开发语言