第一个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)  -- 当前函数名

十一、总结 #

本章你学到了:

  1. 如何启动和使用 Lua 交互式解释器
  2. 如何创建和运行 Lua 脚本文件
  3. print() 函数和格式化输出
  4. 命令行参数的处理
  5. 注释的使用方法
  6. 代码规范和命名约定
  7. 常见错误和错误处理
  8. 基本的调试技巧

下一章,我们将深入学习 Lua 的基础语法,包括数据类型、变量、运算符等内容。

最后更新:2026-03-27