1Programming in Lua(第4版)

入门

Lua基础

变量数据类型操作符注释

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第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)
end

2.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 变量比全局变量快吗?为什么?


1/8入门
0%