Lua 基本语法

Lua 是一种轻量、嵌入式脚本语言,设计简洁灵活,广泛应用于游戏开发(如《魔兽世界》、Roblox)、嵌入式系统和脚本扩展。以下是一个简明实用的 Lua 基本语法手册,涵盖核心语法、数据类型、控制结构、函数、表(Table)等,适合初学者快速上手。


1. Lua 概述

  • 特点
  • 轻量:核心库小,适合嵌入式应用。
  • 动态类型:变量无需声明类型。
  • 基于表的强大数据结构:Table 是 Lua 的核心数据结构。
  • 可扩展:支持 C/C++ 扩展和元表(metatable)自定义行为。
  • 语法规则
  • 不区分大小写(但建议变量名区分大小写)。
  • 语句无需分号(; 可选,建议省略)。
  • 注释:
    • 单行:-- 注释
    • 多行:--[[ 注释 --]]

2. 数据类型

Lua 是动态类型语言,支持以下基本类型:

  • nil:表示空值,类似于 null。
  local x = nil
  print(x) -- 输出: nil
  • booleantruefalse
  local flag = true
  print(flag) -- 输出: true
  • number:表示浮点数(默认 64 位双精度,Lua 5.3+ 支持整数)。
  local num = 42
  print(num) -- 输出: 42
  • string:字符串(不可变),支持单引号 ' 或双引号 "
  local str = "Hello"
  print(str) -- 输出: Hello
  • table:关联数组,类似字典或对象,Lua 的核心数据结构。
  local t = { name = "Alice", age = 25 }
  print(t.name) -- 输出: Alice
  • function:函数是一等公民,可作为变量。
  local func = function() print("Hello") end
  func() -- 输出: Hello
  • userdata:C 语言数据(用户自定义)。
  • thread:用于协程(coroutine)。

检查类型

print(type("Hello")) -- 输出: string
print(type(42))     -- 输出: number
print(type(nil))    -- 输出: nil

3. 变量

  • 作用域
  • 全局变量:默认全局,任何地方可访问(不推荐)。
  • 局部变量:使用 local 声明,作用域限于当前块。
  local x = 10 -- 局部变量
  y = 20       -- 全局变量
  print(x, y)  -- 输出: 10    20
  • 命名规则
  • 字母、数字、下划线,不能以数字开头。
  • 避免使用 Lua 关键字(如 ifforfunction)。

4. 控制结构

4.1 条件语句(if)

local age = 18
if age >= 18 then
    print("Adult")
elseif age >= 13 then
    print("Teen")
else
    print("Child")
end
  • 说明
  • 使用 then 开始条件块,end 结束。
  • elseif 可选,else 可选。

4.2 循环语句

  • while 循环
  local i = 1
  while i <= 3 do
      print(i)
      i = i + 1
  end

输出1 2 3

  • repeat-until 循环
  local i = 1
  repeat
      print(i)
      i = i + 1
  until i > 3

输出1 2 3

  • 说明:先执行再判断,类似于 do-while。
  • for 循环
  • 数值型 for: lua for i = 1, 3 do print(i) end输出1 2 3
    • 可指定步长:for i = 1, 5, 2 do(步长为 2)。
  • 泛型 for(遍历表):
    lua local t = { "a", "b", "c" } for i, v in ipairs(t) do print(i, v) end
    输出
    1 a 2 b 3 c

4.3 break 和 return

  • break:退出当前循环。
  • return:从函数返回。
for i = 1, 5 do
    if i == 3 then
        break -- 退出循环
    end
    print(i)
end

输出1 2


5. 函数

  • 定义
  function add(a, b)
      return a + b
  end
  print(add(2, 3)) -- 输出: 5
  • 匿名函数:
    lua local func = function(x) return x * 2 end print(func(5)) -- 输出: 10
  • 多返回值
  function getInfo()
      return "Alice", 25
  end
  local name, age = getInfo()
  print(name, age) -- 输出: Alice    25
  • 可变参数
  function sum(...)
      local total = 0
      for _, v in ipairs({...}) do
          total = total + v
      end
      return total
  end
  print(sum(1, 2, 3, 4)) -- 输出: 10

6. 表(Table)

Table 是 Lua 的核心数据结构,兼具数组和字典功能。

  • 创建
  local t = { 1, 2, 3 } -- 数组风格
  local person = { name = "Alice", age = 25 } -- 字典风格
  • 访问
  • 数组索引:t[1](从 1 开始,区别于 C 的 0)。
  • 字典键:person.nameperson["name"]
  print(t[1])         -- 输出: 1
  print(person.name)  -- 输出: Alice
  • 修改
  t[1] = 10
  person.age = 26
  • 遍历
  • 数组:使用 ipairs(按索引顺序)。
  • 字典:使用 pairs(遍历所有键值对)。
  for k, v in pairs(person) do
      print(k, v)
  end

输出

  name    Alice
  age     26

7. 运算符

  • 算术+, -, *, /, %, ^(幂)。
  print(5 + 3) -- 输出: 8
  print(2 ^ 3) -- 输出: 8
  • 关系==, ~=, <, >, <=, >=
  • 注意:~= 表示不等于(不同于 !=)。
  print(5 ~= 3) -- 输出: true
  • 逻辑and, or, not
  print(true and false) -- 输出: false
  print(not true)      -- 输出: false
  • 字符串连接..
  print("Hello" .. " World") -- 输出: Hello World
  • 长度#(用于表或字符串)。
  local t = {1, 2, 3}
  print(#t) -- 输出: 3
  print(#"Hello") -- 输出: 5

8. 模块

  • 定义模块
  -- mymodule.lua
  local M = {}
  function M.sayHello(name)
      return "Hello, " .. name
  end
  return M
  • 使用模块
  local mymodule = require("mymodule")
  print(mymodule.sayHello("Alice")) -- 输出: Hello, Alice

9. 高级特性

9.1 元表(Metatable)

  • 用于自定义表的操作(如加法、索引)。
local t = setmetatable({}, {
    __add = function(t1, t2)
        return { value = t1.value + t2.value }
    end
})
t.value = 10
local t2 = { value = 20 }
local result = t + t2
print(result.value) -- 输出: 30

9.2 协程(Coroutine)

  • 用于非抢占式多任务处理。
local co = coroutine.create(function()
    for i = 1, 3 do
        print("Coroutine:", i)
        coroutine.yield()
    end
end)
coroutine.resume(co) -- 输出: Coroutine: 1
coroutine.resume(co) -- 输出: Coroutine: 2
coroutine.resume(co) -- 输出: Coroutine: 3

10. 注意事项

  • 索引从 1 开始:表的默认索引从 1 开始(与 C/C++ 不同)。
  • 全局变量风险:避免过多全局变量,使用 local 提高性能和安全性。
  • 弱类型
  • Lua 自动转换类型(如字符串和数字在某些操作中)。
  print("10" + 5) -- 输出: 15(字符串转为数字)
  • 性能
  • Table 是核心数据结构,适合大多数场景。
  • 频繁操作大表时注意性能,考虑 C 扩展。
  • 调试
  • 使用 printio.write 输出调试信息。
  • Lua 调试器(如 LuaDebug)可用于复杂项目。
  • 兼容性
  • Lua 5.1、5.2、5.3、5.4 有细微差异(如整数支持)。
  • 嵌入式环境中检查 Lua 版本。

11. 常见示例

11.1 简单计算器

function calculator(a, b, op)
    if op == "+" then
        return a + b
    elseif op == "-" then
        return a - b
    else
        return "Invalid operator"
    end
end
print(calculator(5, 3, "+")) -- 输出: 8
print(calculator(5, 3, "-")) -- 输出: 2

11.2 表操作

local t = { name = "Alice", scores = { 90, 85, 88 } }
table.insert(t.scores, 95) -- 添加元素
print(table.concat(t.scores, ", ")) -- 输出: 90, 85, 88, 95
t.scores[1] = nil -- 删除元素(保留空位)
print(#t.scores) -- 输出: 4(长度仍为 4)

12. 总结

  • 核心语法
  • 数据类型:nil, boolean, number, string, table, function 等。
  • 控制结构:if, while, repeat, for
  • 函数:支持多返回值、可变参数。
  • 表(Table):数组和字典的统一实现。
  • 推荐实践
  • 使用 local 定义变量,减少全局污染。
  • 优先用 Table 组织复杂数据。
  • 模块化编程,封装功能到模块。
  • 适用场景:游戏开发、脚本扩展、嵌入式系统。
  • 学习资源
  • 官方文档:https://www.lua.org/manual/
  • Lua 教程:https://www.lua.org/pil/
  • 实践:编写简单脚本(如计算器、配置文件解析)。

如果你需要更详细的示例(如元表实现、协程使用、结合 C 扩展)或针对特定场景的 Lua 代码,请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注