第一个Lua程序 #
一、程序员的仪式:Hello World #
按照程序员的传统,学习一门新语言的第一件事就是输出"Hello World"。让我们开始吧!
二、交互式解释器 #
2.1 启动解释器 #
打开终端,输入 lua 命令:
bash
$ lua
Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio
>
你会看到 > 提示符,表示 Lua 正在等待你输入代码。
2.2 输出 Hello World #
在提示符后输入:
lua
> print("Hello World!")
Hello World!
恭喜!你已经运行了第一个 Lua 程序。
2.3 尝试更多操作 #
lua
> -- 简单计算
> 1 + 1
2
> -- 字符串连接
> "Hello" .. " " .. "Lua"
Hello Lua
> -- 表达式
> 2 ^ 10
1024.0
> -- 定义变量
> name = "Lua"
> print("Hello, " .. name .. "!")
Hello, Lua!
> -- 定义函数
> function greet(n) return "Hello, " .. n .. "!" end
> print(greet("World"))
Hello, World!
2.4 退出解释器 #
lua
> os.exit()
或者按 Ctrl + D(macOS/Linux)或 Ctrl + Z(Windows)。
三、运行脚本文件 #
3.1 创建脚本文件 #
使用文本编辑器创建一个名为 hello.lua 的文件:
lua
-- hello.lua
-- 我的第一个 Lua 程序
print("Hello World!")
print("你好,Lua!")
print("这是一个简单的 Lua 程序")
3.2 运行脚本 #
在终端中,切换到文件所在目录,运行:
bash
lua hello.lua
输出:
text
Hello World!
你好,Lua!
这是一个简单的 Lua 程序
3.3 添加执行权限(Unix系统) #
bash
# 添加 shebang 行
#!/usr/bin/env lua
-- hello.lua
print("Hello World!")
# 添加执行权限
chmod +x hello.lua
# 直接运行
./hello.lua
四、命令行参数 #
4.1 获取参数 #
Lua 通过全局变量 arg 访问命令行参数:
lua
-- args.lua
print("脚本名:" .. arg[0])
if arg[1] then
print("第一个参数:" .. arg[1])
else
print("没有提供参数")
end
-- 打印所有参数
for i, v in ipairs(arg) do
print(string.format("arg[%d] = %s", i, v))
end
运行:
bash
$ lua args.lua hello world 123
脚本名:args.lua
第一个参数:hello
arg[1] = hello
arg[2] = world
arg[3] = 123
4.2 参数处理示例 #
lua
-- greet.lua
local name = arg[1] or "World"
local count = tonumber(arg[2]) or 1
for i = 1, count do
print(string.format("%d. Hello, %s!", i, name))
end
运行:
bash
$ lua greet.lua Lua 3
1. Hello, Lua!
2. Hello, Lua!
3. Hello, Lua!
五、print 函数详解 #
5.1 基本用法 #
lua
-- 输出字符串
print("Hello") -- Hello
-- 输出数字
print(123) -- 123
print(3.14) -- 3.14
-- 输出布尔值
print(true) -- true
print(false) -- false
-- 输出 nil
print(nil) -- nil
-- 输出表(只显示地址)
print({}) -- table: 0x12345678
5.2 输出多个值 #
lua
-- print 可以接受多个参数
print("姓名:", "张三", "年龄:", 25)
-- 输出:姓名: 年龄: 25
-- 注意:print 用制表符分隔多个值
5.3 格式化输出 #
lua
-- 使用 string.format
local name = "Lua"
local version = 5.4
print(string.format("欢迎使用 %s %.1f", name, version))
-- 输出:欢迎使用 Lua 5.4
-- 格式化数字
print(string.format("整数:%d,浮点数:%.2f", 42, 3.14159))
-- 输出:整数:42,浮点数:3.14
-- 格式化日期
print(string.format("日期:%04d-%02d-%02d", 2024, 3, 27))
-- 输出:日期:2024-03-27
六、注释 #
6.1 单行注释 #
lua
-- 这是单行注释
print("Hello") -- 行尾注释
6.2 多行注释 #
lua
--[[
这是多行注释
可以写很多行
]]
--[[
另一种写法
使用两个方括号
]]
6.3 注释技巧 #
lua
-- 快速启用/禁用代码块
--[[
print("这段代码被注释了")
print("不会执行")
--]]
-- 添加一个 - 就可以启用
---[[
print("这段代码会执行")
print("启用了!")
--]]
七、代码规范 #
7.1 命名规范 #
lua
-- 变量名:小写,下划线分隔
local user_name = "张三"
local max_count = 100
-- 常量:大写,下划线分隔
local MAX_CONNECTIONS = 100
local PI = 3.14159
-- 函数名:小写,下划线分隔
function calculate_sum(a, b)
return a + b
end
-- 类/表名:驼峰式
local UserManager = {}
local HttpRequest = {}
-- 私有变量:下划线前缀
local _internal_value = 42
7.2 缩进与空格 #
lua
-- 使用 4 个空格缩进(推荐)
function foo()
if true then
print("缩进 4 个空格")
end
end
-- 运算符两边加空格
local sum = a + b
local result = a * b + c
-- 逗号后加空格
local arr = {1, 2, 3, 4, 5}
func(arg1, arg2, arg3)
7.3 代码组织 #
lua
-- 文件头部说明
--[[
文件名:example.lua
描述:示例文件
作者:Your Name
日期:2024-03-27
]]
-- 模块定义
local M = {}
-- 常量定义
M.VERSION = "1.0.0"
-- 私有变量
local _config = {}
-- 私有函数
local function helper()
-- ...
end
-- 公共函数
function M.main()
-- ...
end
return M
八、常见错误 #
8.1 语法错误 #
lua
-- 缺少引号
print("Hello) -- 错误:未闭合的字符串
-- 括号不匹配
print("Hello" -- 错误:缺少右括号
-- 关键字拼写错误
function myFunc() -- 正确
funtion myFunc() -- 错误:拼写错误
8.2 运行时错误 #
lua
-- 访问 nil 变量
print(unknownVar.field) -- 错误:attempt to index a nil value
-- 类型错误
print("hello" + 1) -- 错误:attempt to perform arithmetic on a string value
-- 表索引错误
local t = {}
print(t[1].name) -- 错误:attempt to index a nil value
8.3 错误处理 #
lua
-- 使用 pcall 安全执行
local ok, err = pcall(function()
print(unknownVar.field)
end)
if not ok then
print("发生错误:" .. err)
end
-- 使用 xpcall 获取调用栈
local function errorHandler(err)
print("错误:" .. err)
print(debug.traceback())
return err
end
xpcall(function()
print(unknownVar.field)
end, errorHandler)
九、实用示例 #
9.1 简单计算器 #
lua
-- calculator.lua
print("简单计算器")
print("=" .. string.rep("-", 20))
local a = tonumber(arg[1]) or 10
local b = tonumber(arg[2]) or 5
print(string.format("%d + %d = %d", a, b, a + b))
print(string.format("%d - %d = %d", a, b, a - b))
print(string.format("%d * %d = %d", a, b, a * b))
print(string.format("%d / %d = %.2f", a, b, a / b))
9.2 猜数字游戏 #
lua
-- guess.lua
local target = math.random(1, 100)
local guess = 0
local count = 0
print("猜数字游戏(1-100)")
while guess ~= target do
io.write("请输入你的猜测:")
guess = tonumber(io.read())
count = count + 1
if guess == nil then
print("请输入有效的数字!")
elseif guess < target then
print("太小了!")
elseif guess > target then
print("太大了!")
end
end
print(string.format("恭喜!你猜对了!用了 %d 次。", count))
9.3 文件读取 #
lua
-- fileread.lua
local filename = arg[1]
if not filename then
print("用法:lua fileread.lua <文件名>")
os.exit(1)
end
local file = io.open(filename, "r")
if not file then
print("无法打开文件:" .. filename)
os.exit(1)
end
print("文件内容:")
print("-" .. string.rep("-", 40))
for line in file:lines() do
print(line)
end
file:close()
十、调试技巧 #
10.1 打印调试 #
lua
-- 使用 print 调试
local value = 42
print("调试:value =", value)
-- 打印表
function printTable(t, indent)
indent = indent or ""
for k, v in pairs(t) do
if type(v) == "table" then
print(indent .. k .. ":")
printTable(v, indent .. " ")
else
print(indent .. k .. ": " .. tostring(v))
end
end
end
local person = {name = "张三", age = 25, address = {city = "北京"}}
printTable(person)
10.2 使用 assert #
lua
-- 断言检查
local function divide(a, b)
assert(b ~= 0, "除数不能为 0")
return a / b
end
print(divide(10, 2)) -- 5.0
print(divide(10, 0)) -- 错误:除数不能为 0
10.3 使用 debug 库 #
lua
-- 打印调用栈
function traceback()
print(debug.traceback())
end
-- 获取变量信息
local x = 42
print(debug.getinfo(1, "n").name) -- 当前函数名
十一、总结 #
本章你学到了:
- 如何启动和使用 Lua 交互式解释器
- 如何创建和运行 Lua 脚本文件
print()函数和格式化输出- 命令行参数的处理
- 注释的使用方法
- 代码规范和命名约定
- 常见错误和错误处理
- 基本的调试技巧
下一章,我们将深入学习 Lua 的基础语法,包括数据类型、变量、运算符等内容。
最后更新:2026-03-27