【Lua】Lua 入门知识点总结

news2025/4/24 6:14:12

Lua 入门学习笔记

本教程旨在帮助有编程基础的学习者快速入门Lua编程语言。包括Lua中变量的声明与使用,包括全局变量和局部变量的区别,以及nil类型的概念、数值型、字符串和函数的基本操作,包括16进制表示、科学计数法、字符串连接、函数声明与调用等。此外,还介绍了table类型及其数字下标和字符串下标的用法,包括数组型table的声明、赋值、长度获取以及元素操作等。最后,介绍了Lua中的全局表、真和假的定义、分支判断语句以及三种循环语句(for循环、while循环)

建议有编程基础的同学使用这篇文章

一、编译环境

在线体验LuatOS

先直接写一个输出

print("hello world")
  • print不是printf
  • 语句后面没有分号

二、变量声明与作用域

  • 默认全局变量:Lua 中直接赋值的变量默认是全局变量,跨文件可见。

  • 局部变量:使用 local 关键字声明,作用域限定在当前代码块、函数或文件内。

  • 多变量赋值

    local a = 0
    b, c = 1, 2    -- 同时声明 b=1, c=2
    d, e, f = 1, 2 -- c 未被赋值,值为 nil
    
    • 规则
      • 左侧变量数 > 右侧值时,多余变量赋 nil
      • 右侧值数 > 左侧变量时,多余值被忽略。

三、数据类型系统

nil 类型
  • 表示未初始化或显式赋空值:没有初始化的都为nil

  • 相当于C语言中的NULL类型

    local a
    print(undeclared_var) -- 输出 nil
    
number 类型

在c语言里面数值有很多个类型,比如说int chair long float,但是在lua里面都统一叫做number数值型。

  • 统一数值类型,支持多种表示方式:

    • 十进制:123
    • 十六进制:0x1F(十进制 31)
    • 科学计数法:2e10(表示 20000000000)
  • 运算支持: lua也是支持加减乘除运算的,以及成幂符号,左移右移

    print(10 ^ 5)    -- 幂运算输出 100000
    print(1 << 3)    -- 左移运算输出 8
    print(8 >> 1)    -- 右移运算输出 4
    
string 类型

字符串的声明的话,跟c是差不多的。我们可以在lua里用双引号来圈住一些字,表示一个字符串也可以用单引号圈出一个字,表示字符串单引号和双引号都是可以的,而且支持转义字符。

  • 声明方式

    • 单引号/双引号:支持转义符(如 \n

    • 长字符串:[[多行文本]](保留原始格式,不转义)

      a = "agcuiogogqWCU"
      b = 'uigdcfuwioge'
      c = [[dghoeuivfqwe 
      qiowhc
      
      1266]]
      
  • 操作

    另外在lua里面字符串的连接符号不是加号,是两个点

    c = a..b                -- 连接运算符是两个点
    print(#"0123456789")    -- 井号获取长度,输出 10
    
  • 类型转换

    s = tostring(10)       -- 转字符串 "10"
    n = tonumber("10")     -- 转数值 10
    tonumber("abc")        -- 转换失败返回 nil
    
  • 显示字符串长度:

    a = "agcuiogogqWCU"
    print(#a) 			   --在打印的前面加上'#'就可以显示这个字符串的长度
    

四、函数定义与使用

函数声明
  • 一般的声明方式:

    function function_name(...)
    	...-- body
    end
    
  • 两种等效方式:

    function f(a, b) print(a, b) end
    f = function(a, b) print(a, b) end
    
参数与返回值
  • 参数处理

    • 参数不足时自动补 nil,多余参数被忽略。
  • 多返回值: 我们可以在函数里主动返回一些值,并且可以返回多个值

    function f() return 1, 2 end
    i, j = f() -- i=1, j=2
    
  • 默认返回值:无 return 时返回 nil


五、表(table)数据结构

数组型 table
  • 语法:

    • 用大括号将成员括起来 ‘{ }’

    • 用赋值 ‘=’ 赋值给变量

    • 用逗号将成员分开 ‘,’

      arr = {1,2,3,4,5}
      
  • 核心特性

    • 下标从 1 开始,支持混合类型元素(也就是说可以存数字、字符串、函数、其他的table,但要注意用 ‘,’ 隔开)。
    • 未定义元素值为 nil
    • 动态扩展——对于table中没有定义的位置可以直接赋值
    • 自带的接口
      • insert(【table】,【位置】,【值】)
      • remove(【table】,【位置】) ——有返回值,返回被移除的元素
  • 操作示例

    arr = {1, "two", {subtable = true}}
    print(arr[5])           -- 输出 nil
    arr[5] = "new"          -- 动态扩展
    print(#arr)             -- 获取长度 5
    table.insert(arr, 2, "d")  -- 插入元素
    removed = table.remove(arr, 2) -- 移除元素并返回 "d"
    
哈希表型 table
  • 字符串下标

    tbl = {
        key1 = 1,
        c = function()
            --.....
        end,
        ["特殊符号"] = 123 		--注意中括号以及""
    }
    tbl["abc"] = "abc"
    print(tbl.key1)            -- 输出 1(这种输出方式需要字符串下标符合变量命名规范)
    print(tbl["特殊符号"])    	-- 输出 123(注意是字符串,带有"")
    
  • 未声明键值返回 nil支持动态添加键值对

全局表 _G
  • 存储所有全局变量

    a = 1
    print(_G["a"])
    print(_G.a)            -- 输出 1
    print(_G.table.insert) -- 输出函数地址
    
  • 实际上table也是一个全局变量,table这个全局变量它的类型就是table,它有一个下标叫做insert,同时table, 它因为是全局变量,所以它也在下划线g全局表里面,就像这样,我们打印出来发现它是一个table,而且呢,因为他也是一个table.

print(_G["table"]["insert"])

六、控制结构

逻辑运算
  • 真假规则:仅 falsenil 为假,其他值(包括 0)为真。

    a = true
    b = false
    print(1 > 2)
    print(1 < 2)
    print(1 <= 2)
    print(1 >= 2)
    print(1 == 2)
    print(1 ~= 2)
    

    注意:在lua中不等于是用 " ~=" 表示的,不是用 “!=” 表示的

    短路求值

    print(nil or 0)       -- 输出 0(返回第一个真值)
    print(true and "yes") -- 输出 "yes"(返回第二个操作数)
    
  • and(与) or(或) 和 not(非)

    a = true
    b = false
    print(a and b)
    print(a or b)
    print(not a)
    

    注意:

    • 在lua里有个特殊的规定,在lua里面只有false和nil代表假,其他都是真c语言里面零也代表假,但是在lua里面数字0是代表真的,因为他不是nil或者false

    • Lua里面的end or和not返回的并不是完全是false和true, lua里会直接返回a或者b的值

    • 我们可以用and和or来实现短路求值

      a = nil
      b = 0
      print(a and b)
      print(a or b)
      print(not a)
      

      运行结果:

      在这里插入图片描述

分支判断
  • 语法

    if 【condition】 then
      -- code
    elseif 【condition2】 then
      -- code
    else
      -- code
    end
    
  • 注意:

    • elseif中间没有空格
    • 条件后面有then
    • 就像上面提到的0也是代表真
循环结构
  • for 循环

    for i = 1, 10 do  -- 倒序循环
      if i == 5 then break end
    end
    

    注意:

    • 循环定义了一个变量,然后给变量一个初值,再给变量定义一个结束值,下面是执行的代码块,这个变量是可以直接使用的。当然这个变量出了这个代码块之后,就没有意义了

    • 我们还可以再加一个参数,这个参数叫做步长,就是每一次循环初值i的变化的值

    • 循环里面i在运行图中是不能手动更改的。如果你修改了,他会默认悄悄给你在这边新建一个变量,它新建了一个临时变量,叫做i,你后面调用的时候会用到i,这一点和c不太一样,它的循环是不能更改的。

      for i = 10, 1, -1 do  -- 倒序循环
        if i == 5 then break end
      end
      
      for i=10,i,-1 do
      	print(i)
      	local i=1  -- 新建一个临时变量
      	--....
      end
      
  • while 循环

    n = 10
    while n > 1 do
      n = n - 1  -- 必须显式修改循环变量
      if n == 5 then break end
    end
    

    注意:lua不支持自减操作如n--n -= 1这些

七、字符串高级特性

  • 二进制安全:支持存储空字符(0x00):

    s = string.char(0x30, 0x31, 0x32, 0x33, 0x00)
    print(#s)  -- 输出 5(包含空字符)
    
  • 索引从 1 开始

    second = string.sub(s, 2, 2)
    print(string.byte(second))  -- 输出 49(ASCII 码值)
    

八、类型转换与数值表示

操作成功返回值失败返回值
tonumber("123")123nil
tonumber("0x1F")31nil
tostring(123)“123”-
tostring(nil)“nil”-

九、编程实践要点

  1. 变量作用域:优先使用 local 声明局部变量。
  2. 表操作:注意数组下标从 1 开始,# 仅统计连续数字下标长度。
  3. 字符串处理:使用 .. 连接,# 获取字节长度。
  4. 函数设计:支持多返回值,参数不足自动补 nil
  5. 全局变量管理:通过 _G 表访问,避免污染全局命名空间。

进一步学习建议

  • 参考 Lua 5.3 官方手册
  • 搜索 “Lua 5.3 参考手册” 查看完整函数库(如数学库、协程等)。

后面我会整理进阶部分的笔记,之后会把笔记链接粘贴到这里。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2341245.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

光谱相机在肤质检测中的应用

光谱相机在肤质检测中具有独特优势&#xff0c;能够通过多波段光谱分析皮肤深层成分及生理状态&#xff0c;实现‌非侵入式、高精度、多维度的皮肤健康评估‌。以下是其核心应用与技术细节&#xff1a; ‌一、工作原理‌ ‌光谱反射与吸收特性‌&#xff1a; ‌血红蛋白‌&a…

机器学习第一篇 线性回归

数据集&#xff1a;公开的World Happiness Report | Kaggle中的happiness dataset2017. 目标&#xff1a;基于GDP值预测幸福指数。&#xff08;单特征预测&#xff09; 代码&#xff1a; 文件一&#xff1a;prepare_for_traning.py """用于科学计算的一个库…

CS144 Lab1实战记录:实现TCP重组器

文章目录 1 实验背景与要求1.1 TCP的数据分片与重组问题1.2 实验具体任务 2 重组器的设计架构2.1 整体架构2.2 数据结构设计 3 重组器处理的关键场景分析3.1 按序到达的子串&#xff08;直接写入&#xff09;3.2 乱序到达的子串&#xff08;需要存储&#xff09;3.3 与已处理区…

Linux安装mysql_exporter

mysqld_exporter 是一个用于监控 MySQL 数据库的 Prometheus exporter。可以从 MySQL 数据库的 metrics_schema 收集指标&#xff0c;相关指标主要包括: MySQL 服务器指标:例如 uptime、version 等数据库指标:例如 schema_name、table_rows 等表指标:例如 table_name、engine、…

BeautifulSoup 库的使用——python爬虫

文章目录 写在前面python 爬虫BeautifulSoup库是什么BeautifulSoup的安装解析器对比BeautifulSoup的使用BeautifulSoup 库中的4种类获取标签获取指定标签获取标签的的子标签获取标签的的父标签(上行遍历)获取标签的兄弟标签(平行遍历)获取注释根据条件查找标签根据CSS选择器查找…

HTTP的Header

一、HTTP Header 是什么&#xff1f; HTTP Header 是 HTTP 协议中的头部信息部分&#xff0c;位于请求或响应的起始行之后&#xff0c;用来在客户端&#xff08;浏览器等&#xff09;与服务器之间传递元信息&#xff08;meta-data&#xff09;&#xff08;简单理解为传递信息的…

linux虚拟机网络问题处理

yum install -y yum-utils \ > device-mapper-persistent-data \ > lvm2 --skip-broken 已加载插件&#xff1a;fastestmirror, langpacks Loading mirror speeds from cached hostfile Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7&arch…

AI-Sphere-Butler之如何使用Llama factory LoRA微调Qwen2-1.5B/3B专属管家大模型

环境&#xff1a; AI-Sphere-Butler WSL2 英伟达4070ti 12G Win10 Ubuntu22.04 Qwen2.-1.5B/3B Llama factory llama.cpp 问题描述&#xff1a; AI-Sphere-Butler之如何使用Llama factory LoRA微调Qwen2-1.5B/3B管家大模型 解决方案&#xff1a; 一、准备数据集我这…

协同推荐算法实现的智能商品推荐系统 - [基于springboot +vue]

&#x1f6cd;️ 智能商品推荐系统 - 基于springboot vue &#x1f680; 项目亮点 欢迎来到未来的购物体验&#xff01;我们的智能商品推荐系统就像您的私人购物顾问&#xff0c;它能读懂您的心思&#xff0c;了解您的喜好&#xff0c;为您精心挑选最适合的商品。想象一下&am…

Jenkins的地位和作用

所处位置 Jenkins 是一款开源的自动化服务器&#xff0c;广泛应用于软件开发和测试流程中&#xff0c;主要用于实现持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;。它在开发和测试中的位置和作用可以从以下几个方面来理解&#xff1a; 1. 在开发和测…

【集合】底层原理实现及各集合之间的区别

文章目录 集合2.1 介绍一下集合2.2 集合遍历的方法2.3 线程安全的集合2.4 数组和集合的区别2.5 ArrayList和LinkedList的区别2.6 ArrayList底层原理2.7 LinkedList底层原理2.8 CopyOnWriteArrayList底层原理2.9 HashSet底层原理2.10 HashMap底层原理2.11 HashTable底层原理2.12…

srp batch

参考网址&#xff1a; Unity MaterialPropertyBlock 正确用法&#xff08;解决无法合批等问题&#xff09;_unity_define_instanced_prop的变量无法srp合批-CSDN博客 URP | 基础CG和HLSL区别 - 哔哩哔哩 (bilibili.com) 【直播回放】Unity 批处理/GPU Instancing/SRP Batche…

【Linux运维涉及的基础命令与排查方法大全】

文章目录 前言1、计算机网络常用端口2、Kali Linux中常用的命令3、Kali Linux工具的介绍4、Ubuntu没有网络连接解决方法5、获取路由6、数据库端口 前言 以下介绍计算机常见的端口已经对应的网络协议&#xff0c;Linux中常用命令&#xff0c;以及平时运维中使用的排查网络故障的…

Webview+Python:用HTML打造跨平台桌面应用的创新方案

目录 一、技术原理与优势分析 1.1 架构原理 1.2 核心优势 二、开发环境搭建 2.1 安装依赖 2.2 验证安装 三、核心功能开发 3.1 基础窗口管理 3.2 HTML↔Python通信 JavaScript调用Python Python调用JavaScript 四、高级功能实现 4.1 系统级集成 4.2 多窗口管理 五…

克服储能领域的数据处理瓶颈及AI拓展

对于储能研究人员来说&#xff0c;日常工作中经常围绕着一项核心但有时令人沮丧的任务&#xff1a;处理实验数据。从电池循环仪的嗡嗡声到包含电压和电流读数的大量电子表格&#xff0c;研究人员的大量时间都花在了提取有意义的见解上。长期以来&#xff0c;该领域一直受到对专…

包含物体obj与相机camera的 代数几何代码解释

反余弦函数的值域在 [0, pi] 斜体样式 cam_pose self._cameras[hand_realsense].camera.get_model_matrix() # cam2world# 物体到相机的向量 obj_tcp_vec cam_pose[:3, 3] - self.obj_pose.p dist np.linalg.norm(obj_tcp_vec) # 物体位姿的旋转矩阵 obj_rot_mat self.ob…

mybatis实现增删改查1

文章目录 19.MyBatis查询单行数据MapperScan 结果映射配置核心文件Results自定义映射到实体的关系 多行数据查询-完整过程插入数据配置mybatis 控制台日志 更新数据删除数据小结通过id复用结果映射模板xml处理结果映射 19.MyBatis 数据库访问 MyBatis&#xff0c;MyBatis-Plus…

Git,本地上传项目到github

一、Git的安装和下载 https://git-scm.com/ 进入官网&#xff0c;选择合适的版本下载 二、Github仓库创建 点击右上角New新建一个即可 三、本地项目上传 1、进入 要上传的项目目录&#xff0c;右键&#xff0c;选择Git Bash Here&#xff0c;进入终端Git 2、初始化临时仓库…

基于flask+vue框架的灯饰安装维修系统u49cf(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,工单人员,服务项目,订单记录,服务记录,评价记录 开题报告内容 基于 FlaskVue 框架的灯饰安装维修系统开题报告 一、选题背景与意义 &#xff08;一&#xff09;选题背景 随着城市化进程的加速与居民生活品质的显著提升&#xf…

【算法】BFS-解决FloodFill问题

目录 FloodFill问题 图像渲染 岛屿数量 岛屿的最大面积 被围绕的区域 FloodFill问题 FloodFill就是洪水灌溉的意思&#xff0c;假设有下面的一块田地&#xff0c;负数代表是凹地&#xff0c;正数代表是凸地&#xff0c;数字的大小表示凹或者凸的程度。现在下一场大雨&…