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

相关推荐
C语言不精5 小时前
合宙780E开发学习-Lua语法学习
学习·junit·lua
川石课堂软件测试13 小时前
技术干货|使用Prometheus+Grafana监控Tomcat实例详解
redis·功能测试·单元测试·tomcat·测试用例·grafana·prometheus
若行若冲14 小时前
Idea中 lombok 在“测试类中-单元测试”运行失败及解决方法
单元测试·log4j·maven·intellij-idea·lombok
鱼鱼说测试15 小时前
postman接口自动化测试
开发语言·lua
lucky_lyovo19 小时前
大模型部署
开发语言·人工智能·云计算·lua
前端工作日常1 天前
我的 Jasmine 入门之旅
前端·单元测试·测试
Warren981 天前
Spring Boot 拦截器返回中文乱码的解决方案(附全局优化思路)
java·网络·spring boot·redis·后端·junit·lua
张铁铁是个小胖子2 天前
redis执行lua脚本的原子性和数据库原子性的区别
数据库·redis·lua
染翰4 天前
lua入门以及在Redis中的应用
开发语言·redis·lua