第1章:入门
一、导读
1.1 本章学习目标
第1章讲解 Lua 的基础语法:变量、数据类型、操作符、注释。
本章核心学习目标:
- 理解 Lua 的设计哲学:小巧、嵌入、高效
- 掌握基本数据类型:nil、boolean、number、string
- 理解全局变量和局部变量
- 掌握 Lua 的交互式环境
1.2 为什么本章如此重要
Lua 以极小的体积提供强大的功能,是游戏开发和嵌入式脚本的首选语言。
1.3 核心问题引导
Lua 为什么只有 8 种基本类型?
Lua 的变量默认是全局的还是局部的?
Lua 的 number 类型在 5.3 前后有什么变化?
二、核心概念详解
2.1 基本数据类型
lua
-- Lua 有 8 种基本类型
print(type(nil)) -- nil
print(type(true)) -- boolean
print(type(42)) -- number
print(type(3.14)) -- number
print(type("hello")) -- string
print(type(print)) -- function
print(type({1,2,3})) -- table
print(type(coroutine.create(function() end))) -- thread
-- nil 表示"没有值"
x = nil -- x 不再有任何值
print(x) -- nil
-- boolean: 只有 false 和 nil 是假
if false then print("false") end -- 不执行
if nil then print("nil") end -- 不执行
if 0 then print("0") end -- 执行! (0 在 Lua 中是真值)
if "" then print("empty") end -- 执行! (空字符串也是真值)2.2 变量
lua
-- 全局变量 (默认)
x = 10 -- 全局变量
-- 局部变量 (推荐)
local y = 20 -- 局部变量,作用域在当前块
-- 多重赋值
a, b, c = 1, 2, 3
a, b = b, a -- 交换
-- 多余的变量被赋为 nil
x, y, z = 1, 2 -- z = nil
-- 多余的值被忽略
a, b = 1, 2, 3 -- 3 被忽略
-- 块作用域
local function factorial(n)
if n <= 1 then return 1 end
return n * factorial(n - 1)
end2.3 操作符
lua
-- 算术
print(10 + 3) -- 13
print(10 - 3) -- 7
print(10 * 3) -- 30
print(10 / 3) -- 3.333...
print(10 // 3) -- 3 (整数除法, Lua 5.3+)
print(10 % 3) -- 1
print(2 ^ 10) -- 1024
-- 关系
print(1 == 1) -- true
print(1 ~= 2) -- true (不等于)
print(1 < 2) -- true
-- 逻辑
print(true and false) -- false
print(true or false) -- true
print(not true) -- false
-- 常用模式
x = x or default -- 如果 x 为 nil/false,使用默认值2.4 字符串
lua
-- 字符串
s1 = "hello"
s2 = 'world'
s3 = [[multi
line
string]]
-- 连接
print("hello" .. " " .. "world") -- hello world
-- 长度
print(#"hello") -- 5
-- 转换
print(tonumber("42")) -- 42
print(tostring(42)) -- "42"
-- 模式匹配 (类似正则)
s = "hello world"
print(string.find(s, "world")) -- 7 11
print(string.sub(s, 1, 5)) -- hello
print(string.upper(s)) -- HELLO WORLD
print(string.rep("ha", 3)) -- hahaha三、实战案例
3.1 案例一:简单的计算器
lua
function calculate(a, op, b)
if op == "+" then return a + b
elseif op == "-" then return a - b
elseif op == "*" then return a * b
elseif op == "/" then
if b == 0 then return nil, "division by zero" end
return a / b
else
return nil, "unknown operator"
end
end
-- 测试
local result, err = calculate(10, "+", 5)
if result then
print("Result: " .. result)
else
print("Error: " .. err)
end
-- 交互式
io.write("Enter expression (e.g., 10 + 5): ")
local line = io.read()
local a, op, b = string.match(line, "(%d+)%s*([%+%-%*/])%s*(%d+)")
if a then
local result = calculate(tonumber(a), op, tonumber(b))
print("= " .. result)
else
print("Invalid expression")
end四、本章小结
Lua 只有 8 种基本类型,设计极简
变量默认是全局的,应该总是用 local
只有 false 和 nil 是假值,0 和空字符串是真值
五、思考与练习
为什么 Lua 的 number 在 5.3 分为 integer 和 float?
local 变量比全局变量快吗?为什么?