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 来声明变量。

相关推荐
烛阴14 小时前
从create到yield:Lua协程完全上手指南
前端·lua
利来利往17 小时前
lua table.remove引发的偶现bug
bug·lua·table.remove
初见无风18 小时前
3.1 Lua代码中的元表与元方法
开发语言·lua·lua5.4
千里镜宵烛1 天前
Lua--数据文件和持久性
开发语言·junit·lua
安冬的码畜日常1 天前
【JUnit实战3_23】 第十四章:JUnit 5 扩展模型(Extension API)实战(上)
测试工具·junit·单元测试·jdbc·h2·extension模型·junit5扩展
慧都小项2 天前
Parasoft C/C++test如何在ARM DS-5环境中进行测试(下)
单元测试·parasoft·arm ds-5
壹佰大多2 天前
【Redisson分布式锁源码分析-3】
数据结构·分布式·mysql·spring·spring cloud·wpf·lua
JosieBook2 天前
【SpringBoot】30 核心功能 - 单元测试 - JUnit5 单元测试简介与常用注解实战详解
spring boot·后端·单元测试
l1t2 天前
对luasql-duckdb PR的测试
c语言·数据库·单元测试·lua·duckdb
初见无风2 天前
3.3 Lua代码中的协程
开发语言·lua·lua5.4