Lua 语法核心特点

Lua 语法核心特点

  1. 轻量简洁:关键字极少,只有约 20 个。

  2. 动态类型 :变量没有类型,值才有类型。你可以直接写 a = 10,然后再写 a = "hello"

  3. 解释执行:通常不需要编译,由 Lua 解释器直接运行。

  4. "可嵌入性":设计初衷就是作为嵌入式扩展语言,能轻松与 C/C++、Java、C# 等主程序交互。

  5. "多重编程范式":支持过程式、面向对象(通过 table 和 function)、函数式编程。


一、基础语法结构

1. 注释

注释是代码中不会被解释器执行的部分,用于说明。

lua

复制代码
-- 这是单行注释

--[[
    这是多行注释
    可以写很多内容
]]
2. 标识符与关键字
  • 标识符 :变量、函数的名字。规则:以字母或下划线开头,后跟字母、数字、下划线。区分大小写myVarmyvar 是不同的)。

  • 关键字(保留字):以下这些单词不能用作标识符。

    text

    复制代码
    and       break     do        else      elseif
    end       false     for       function  goto
    if        in        local     nil       not
    or        repeat    return    then      true
    until     while
3. 变量与数据类型

变量无需声明,赋值即创建。未赋值的变量值为 nil

数据类型 描述 示例
nil 表示无效值,相当于 null a = nil
boolean 布尔值,只有 truefalse isOpen = true
number 数字(Lua 5.3+ 引入了 integer 子类型 num = 10.5count = 100
string 字符串,用单引号或双引号包裹 name = "Alice"
function 函数,是一等公民 function f() end
table Lua 中唯一的数据结构,可当数组、字典、对象使用 t = {1, 2, 3}t = {name="Bob"}
userdata 用于表示由宿主程序(如 C)创建的对象 (通常不直接使用)
thread 协程,用于实现协作式多线程 (进阶特性)

使用 type() 函数可以获取值的类型:

lua

复制代码
print(type("Hello"))  -- > string
print(type(10.4))     -- > number
print(type(print))    -- > function
print(type(true))     -- > boolean
print(type(nil))      -- > nil
print(type({}))       -- > table

二、核心语法详解

1. 控制流

a) 条件语句 (if, elseif, else)

lua

复制代码
local score = 85

if score >= 90 then
    print("优秀")
elseif score >= 70 then -- 注意是 elseif,不是 else if
    print("良好")
else
    print("再接再厉")
end -- 必须以 end 结尾

注意 :Lua 中 只有 nilfalse 被视为假数字 0 和空字符串 "" 都被视为真

b) 循环语句

  • while 循环

    lua

    复制代码
    local i = 1
    while i <= 5 do
        print(i)
        i = i + 1
    end
  • repeat 循环(相当于 do...while):

    lua

    复制代码
    local i = 1
    repeat
        print(i)
        i = i + 1
    until i > 5 -- 直到条件为真时停止
  • for 循环

    • 数字 for

      lua

      复制代码
      -- 从 1 开始,到 5 结束,步长为 1
      for i = 1, 5, 1 do
          print(i)
      end
      -- 输出:1 2 3 4 5
      
      -- 步长可为负
      for i = 5, 1, -1 do
          print(i)
      end
      -- 输出:5 4 3 2 1
    • 泛型 for(用于遍历表):

      lua

      复制代码
      local t = {"a", "b", "c"}
      -- ipairs 用于遍历序列(连续数字索引的数组)
      for index, value in ipairs(t) do
          print(index, value)
      end
      -- 输出:
      -- 1   a
      -- 2   b
      -- 3   c
      
      local p = {name="Lua", version="5.4"}
      -- pairs 用于遍历所有键值对
      for key, value in pairs(p) do
          print(key, value)
      end
      -- 输出(顺序可能不同):
      -- name    Lua
      -- version 5.4
2. 函数 (Function)

函数使用 function 关键字定义。

  • 定义与调用

    lua

    复制代码
    -- 定义
    function greet(name)
        return "Hello, " .. name .. "!" -- .. 是字符串连接符
    end
    
    -- 调用
    local message = greet("World")
    print(message) -- > Hello, World!
  • 匿名函数与高阶函数

    lua

    复制代码
    -- 匿名函数赋值给变量
    local add = function(a, b)
        return a + b
    end
    print(add(5, 3)) -- > 8
    
    -- 函数作为参数(高阶函数)
    function calculate(x, y, operation)
        return operation(x, y)
    end
    
    local result = calculate(10, 2, function(a, b) return a * b end)
    print(result) -- > 20
  • 多返回值

    lua

    复制代码
    function getDimensions()
        return 1024, 768
    end
    
    local width, height = getDimensions()
    print(width, height) -- > 1024  768
3. 表 (Table) - Lua 的核心

Table 是 Lua 中唯一的数据结构,它非常灵活。

  • 作为数组(列表)

    lua

    复制代码
    local fruits = {"apple", "banana", "cherry"}
    print(fruits[1]) -- 注意:Lua 索引通常从 1 开始! > apple
    print(#fruits)   -- # 运算符获取数组部分的长度 > 3
  • 作为字典(映射)

    lua

    复制代码
    local person = {
        name = "Alice",
        age = 30,
        ["home address"] = "123 Main St" -- 如果键包含特殊字符,需要用方括号和引号
    }
    print(person.name)          -- > Alice (点操作符,键必须是合法标识符)
    print(person["age"])        -- > 30   (方括号操作符,更通用)
    print(person["home address"]) -- > 123 Main St
  • 混合使用

    lua

    复制代码
    local mixed = {
        "value1",           -- 自动获得索引 1
        "value2",           -- 自动获得索引 2
        key1 = "value3",    -- 键值对
        key2 = "value4"
    }
    print(mixed[1], mixed.key1) -- > value1  value3

三、重要概念

1. 作用域与 local 关键字

默认情况下,变量是全局的! 使用 local 关键字来创建局部变量,这是一个非常重要的最佳实践。

lua

复制代码
globalVar = "I am global" -- 全局变量(避免使用)
local localVar = "I am local" -- 局部变量

function test()
    local funcVar = "Visible only in this function"
    print(funcVar)
end

test()
print(globalVar) -- 可以访问
print(localVar)  -- 可以访问
-- print(funcVar) -- 错误!funcVar 在这里不存在
2. 模块化

你可以将代码写在不同的 .lua 文件中,然后用 require 函数加载它们。

  • mymodule.lua:

    lua

    复制代码
    local M = {} -- 创建一个空的表来表示模块
    
    function M.sayHello()
        print("Hello from module!")
    end
    
    local privateFunction = function()
        -- 这是一个私有函数,外部无法访问
    end
    
    return M -- 返回这个表
  • main.lua:

    lua

    复制代码
    local mymodule = require("mymodule") -- 加载模块(省略.lua扩展名)
    mymodule.sayHello() -- > Hello from module!

总结

Lua 的语法精髓在于:

  1. 简单:关键字少,结构清晰。

  2. 灵活table 一统天下,既可作数组也可作字典。

  3. 实用:多返回值、匿名函数、泛型 for 循环等特性让代码写起来非常高效。

  4. 明确 :使用 local 明确作用域,使用 require 实现模块化。

要掌握 Lua,最重要的就是多练习使用 tablefunction,并时刻牢记使用 local 来声明变量。

相关推荐
ellis197011 小时前
LuaC API知识点汇总
unity·lua
杨小熊的笔记15 小时前
final字段单元测试
单元测试·log4j
爱吃小胖橘3 天前
Lua语法
开发语言·unity·lua
东方芷兰3 天前
JavaWeb 课堂笔记 —— 20 SpringBootWeb案例 配置文件
java·开发语言·笔记·算法·log4j·intellij-idea·lua
1nullptr4 天前
Lua上值与闭包
开发语言·lua
半夏知半秋5 天前
skynet-socket.lua源码分析
服务器·开发语言·学习·架构·lua
seabirdssss5 天前
针对单元测试、集成测试、系统测试和验收测试(用户测试)各自的目标和测试内容不同,设计对应的各类测试用例
单元测试·测试用例·集成测试
tianyuanwo5 天前
构建质量的堡垒:一文读懂单元测试、集成测试、系统测试与回归测试
单元测试·集成测试·系统测试·回归测试
小熊出擊7 天前
[pytest] 一文掌握 fixture 的作用域(scope)机制
python·功能测试·单元测试·自动化·pytest
程序员二黑8 天前
告别硬编码!5个让Web自动化脚本更稳定的定位策略
面试·单元测试·测试