【Lua】Lua 入门知识点总结

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 
      qiowhc1266]]
      
  • 操作

    另外在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 doprint(i)local i=1  -- 新建一个临时变量--....
      end
      
  • while 循环

    n = 10
    while n > 1 don = 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.mzph.cn/bicheng/77953.shtml

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

相关文章

符号速率估计——小波变换法

[TOC]符号速率估计——小波变换法 一、原理 1.Haar小波变换 小波变换在信号处理领域被成为数学显微镜&#xff0c;不同于傅里叶变换&#xff0c;小波变换可以观测信号随时间变换的频谱特征&#xff0c;因此&#xff0c;常用于时频分析。   当小波变换前后位置处于同一个码元…

android contentProvider 踩坑日记

写此笔记原因 学习《第一行代码》到第8章节实现provider时踩了一些坑&#xff0c;因此记录下来给后来人和自己一个提示&#xff0c;仅此而已。 包含内容 Sqlite数据库CURD内容provider界面provider项目中书籍管理provider实现逻辑用adb shell确认providercontentResolver接收…

Eureka、LoadBalance和Nacos

Eureka、LoadBalance和Nacos 一.Eureka引入1.注册中心2.CAP理论3.常见的注册中心 二.Eureka介绍1.搭建Eureka Server 注册中心2.搭建服务注册3.服务发现 三.负载均衡LoadBalance1.问题引入2.服务端负载均衡3.客户端负载均衡4.Spring Cloud LoadBalancer1).快速上手2)负载均衡策…

【开关电源】关于GaN反激电源开关噪声

文章目录 0 前言1 设计信息1.1 设计需求1.2 原理图1.3 电源表现 2 原因分析3 横向对比TI UCG28826 &#xff08;GaN&#xff09;采购的普通QR反激变换器 4 总结 0 前言 笔者原计划设计一款省电的&#xff0c;效率尚可的&#xff0c;稳定的2路输出反激电源&#xff0c;用于系统…

DOCA介绍

本文分为两个部分&#xff1a; DOCA及BlueField介绍如何运行DOCA应用&#xff0c;这里以DNS_Filter为例子做大致介绍。 DOCA及BlueField介绍&#xff1a; 现代企业数据中心是软件定义的、完全可编程的基础设施&#xff0c;旨在服务于跨云、核心和边缘环境的高度分布式应用工作…

mybatis mapper.xml中使用枚举

重点&#xff1a;application.propertis配置类 #TypeEnumHandler 这个类的包名&#xff0c;不是全路径 mybatis.type-handlers-packagecom.fan.test.handler两个枚举类&#xff1a; public enum StatusEnum {DELETED(0),ACTIVE(1);private final int code;StatusEnum(int cod…

鸿蒙生态:鸿蒙生态校园行心得

&#xff08;个人观点&#xff0c;仅供参考&#xff09; 兄弟们&#xff0c;今天来浅浅聊一聊这次的设立在长沙的鸿蒙生态行活动。 老样子&#xff0c;我们先来了解一下这个活动&#xff1a; &#xff28;&#xff41;&#xff52;&#xff4d;&#xff4f;&#xff4e;&#x…

【速写】多LoRA并行衍生的一些思考

迁移学习上的一个老问题&#xff0c;怎么做多领域的迁移&#xff1f;以前的逻辑认为领域迁移属于是对参数做方向性的调整&#xff0c;如果两个领域方向相左&#xff0c;实际上不管怎么加权相加都是不合理的。 目前一些做法想着去观察LoRA权重矩阵中的稠密块与稀疏块&#xff0…

【Delphi 基础知识 44】接口interface的应用

目录 1. 前言2. 接口有哪些优势2.1. 实现多态性2.2 实现多重(解决单继承限制)2.3 解耦代码(依赖注入)2.4 便于测试(模拟接口)2.5 跨语言互操作性(COM支持)1. 前言 总结为一句话就是:接口只告诉你要做什么,而类会告诉你应该怎么做 下面是最简单的接口实现 typeIMyIn…

09.传输层协议 ——— TCP协议

文章目录 TCP协议 谈谈可靠性TCP协议格式 序号与确认序号窗口大小六个标志位 确认应答机制&#xff08;ACK&#xff09;超时重传机制连接管理机制 三次握手四次挥手 流量控制滑动窗口拥塞控制延迟应答捎带应答面向字节流粘包问题TCP异常情况TCP小结基于TCP的应用层协议 TCP协…

NLP高频面试题(五十一)——LSTM详解

长短期记忆网络(LSTM)相较于传统循环神经网络(RNN)的核心改进在于通过引入记忆单元(cell state)和门机制(gating mechanism)来有效缓解梯度消失与梯度爆炸问题,从而更好地捕捉长距离依赖关系 。在其网络结构中,信息通过输入门(input gate)、遗忘门(forget gate)和…

SpringCloud组件—Eureka

一.背景 1.问题提出 我们在一个父项目下写了两个子项目&#xff0c;需要两个子项目之间相互调用。我们可以发送HTTP请求来获取我们想要的资源&#xff0c;具体实现的方法有很多&#xff0c;可以用HttpURLConnection、HttpClient、Okhttp、 RestTemplate等。 举个例子&#x…

无需花钱购买域名服务器!使用 VuePress + Github 30分钟搭建属于自己的博客网站(保姆级教程)

前言 GitHub Pages 提供免费全球加速的服务器资源&#xff0c;VuePress 将 Markdown 变成艺术品级的网页&#xff0c;仅需 30 分钟&#xff0c;你便可以像提交代码一样发布文章&#xff0c;过程完全免费。 博客搭建好的效果如下&#xff1a;https://honorsong.github.io/exam…

提交到Gitee仓库

文章目录 注册配置公钥创建空白的码云仓库把本地项目上传到码云对应的空白仓库中 注册 注册并激活码云账号&#xff08; 注册页面地址&#xff1a;https://gitee.com/signup &#xff09; 可以在自己C盘/用户/用户名/.ssh 可以看到 有id_rsa.pub 以前在GitHub注册时搞过&…

如何在 Java 中从 PDF 文件中删除页面(教程)

由于 PDF 文件格式不是 Java 原生支持的&#xff0c;因此要从 PDF 中删除页面&#xff0c;你需要使用外部库。 本教程介绍如何使用 JPedal 来实现这一功能。 开始使用 • 将 JPedal 添加到你的类路径或模块路径中&#xff08;可从官网下载安装试用版 JAR 文件&#xff09; •…

机器学习第二篇 多变量线性回归

数据集&#xff1a;世界幸福指数数据集中的变量有幸福指数排名、国家/地区、幸福指数得分、人均国内生产总值、健康预期寿命、自由权、社会支持、慷慨程度、清廉指数。我们选择GDP per Capita和Freedom&#xff0c;来预测幸福指数得分。 文件一&#xff1a;linear&#xff0c;…

位运算,状态压缩dp(算法竞赛进阶指南学习笔记)

目录 移位运算一些位运算的操作最短 Hamilton 路径&#xff08;状态压缩dp模板&#xff0c;位运算&#xff09; 0x是十六进制常数的开头&#xff1b;本身是声明进制&#xff0c;后面是对应具体的数&#xff1b; 数组初始化最大值时用0x3f赋值&#xff1b; 移位运算 左移 把二…

Java高频面试之并发编程-05

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;线程有哪些调度方法&#xff1f; 在Java中&#xff0c;线程的调用方法主要包括以下几种方式&#xff0c;每种方式适用于…

进程的同步和互斥

进程同步&#xff08;synchronous&#xff09; ✅通俗理解&#xff1a; 就像在排队买饭&#xff0c;一个一个来&#xff0c;前面的人不走&#xff0c;后面的人就不能干事。 进程同步就是&#xff1a;多个进程之间需要协调&#xff0c;有先后顺序&#xff0c;一个进程要等另一…

PDF处理控件Aspose.PDF指南:使用 Python 将 EPUB 转换为 PDF

EPUB是一种流行的电子书格式&#xff0c;用于可重排内容&#xff0c;而PDF则广泛用于固定版式文档&#xff0c;非常适合共享和打印。如果您想使用 Python 将 EPUB 转换为 PDF&#xff0c;Aspose.PDF for Python 提供了一个简单可靠的解决方案。在本教程中&#xff0c;我们将向您…