初识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 教程(菜鸟教程) 中文入门首选

八、结语

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

相关推荐
wearegogog1232 小时前
基于MATLAB实现雷达RCS Swerling模型
开发语言·matlab
星梦清河2 小时前
Java—异步编程
java·开发语言
接着奏乐接着舞2 小时前
dto 转entity方法
java·开发语言
0x00072 小时前
译 Anders Hejlsberg 谈 C# 与 .NET
开发语言·c#·.net
czhaii3 小时前
基于51单片机的Modbus从机通信系统
开发语言·单片机
elseif1233 小时前
【C++】vector 详细版
开发语言·c++·算法
codingPower3 小时前
JAVA后端安全进阶:基于HMAC-SHA256+Nonce+Timestamp的API防重放攻击方案
java·开发语言·spring boot·安全
暗冰ཏོ3 小时前
Go 语言从入门到后端项目实战完整指南
开发语言·后端·golang·go·go语言
Xin_ye100863 小时前
C# 零基础到精通教程 - 第十七章:前端集成——Blazor 基础
开发语言·c#
LDR0063 小时前
LDR6020:多 Type‑C 端口角色管理与外设上电顺序的智慧核心
c语言·开发语言·云计算