Lua脚本

1.准备

1.简介

  • 1.Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放

2.目标

  • 1.其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能

3.特点

  • 1.轻量级:用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可方便嵌入别的程序里
  • 2.可扩展:Lua提供易于使用的扩展接口和机制:由宿主语言(C/C++)提供这些功能,Lua可像内置功能一样使用
  • 3.支持面向过程(procedure-oriented)编程和函数式编程(functional programming)
  • 4.自动内存管理,只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象
  • 5.语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持
  • 6.通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等

4.应用场景

  • 1.游戏开发
  • 2.独立应用脚本
  • 3.Web应用脚本
  • 4.扩展和数据库插件(MySQL ProxyMySQL WorkBench
  • 5.安全系统(入侵检测系统)

5.环境安装

1.Linux系统
curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make linux test
make install
2.Mac系统
curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make macosx test
make install
3.Window系统
  • 1.进入Lua官网:http://www.lua.org
  • 2.点击download
    在这里插入图片描述
  • 3.选择二进制文件
    在这里插入图片描述
  • 4.点击左边的Download并选择对应版本lua-5.4.2_Win64_bin.zip进行下载
    在这里插入图片描述
    在这里插入图片描述
  • 5.将对应压缩包解压到指定文件
    在这里插入图片描述
  • 6.配置环境变量
    在这里插入图片描述
  • 7.进入cmd进行测试
    在这里插入图片描述

2.基础

1.交互式编程

  • 1.默认使用交互式编程
  • 2.交互式编程可以输入程序并立即查看结果
    在这里插入图片描述

2.脚本式编程

  • 1.将Lua程序保存到一个以lua结尾的文件并执行
  • 2.如果Lua脚本文件有错误则内容都不会执行
    在这里插入图片描述
    在这里插入图片描述

3.注释

1.单行注释
--print("Hello World")
print("Hello Lua")

在这里插入图片描述
在这里插入图片描述

2.多行注释
--[[
多行注释
多行注释
--]]

在这里插入图片描述
在这里插入图片描述

4.标示符

  • 1.Lua标示符用于定义一个变量,函数获取其他用户定义的项
  • 2.标示符以一个字母 A-Za-z 或下划线 _ 开头,然后加上 0 个或多个字母,下划线,数字(0-9
  • 3.Lua不允许使用特殊字符( @$% )定义标示符
  • 4.不推荐使用下划线加大写字母的标示符,因为Lua的保留字也是这样
  • 5.一般约定以下划线开头连接一串大写字母的名字( _VERSION)被保留用于Lua内部全局变量
  • 6.Lua是一个区分大小写的编程语言,因此LuaRunoobrunoob是两个不同的标示符

5.关键字

  • 1.Lua保留关键字不能作为常量变量其他用户自定义标示符
    andbreakdoelse
    elseifendfalsefor
    functionifinlocal
    nilnotorrepeat
    returnthentrueuntil
    whilegoto

6.全局变量

  • 1.默认情况下,变量总是认为是全局的
  • 2.全局变量不需要声明,给一个变量赋值后即创建了这个全局变量
  • 3.访问一个没有初始化的全局变量不会出错,只是得到的结果是nil
  • 4.如果想删除一个全局变量,只需要将变量赋值为nil;当且仅当一个变量不等于nil时,这个变量即存在
    在这里插入图片描述

3.数据类型

  • 1.Lua是动态类型语言,变量不要类型定义,只需要为变量赋值

  • 2.值可以存储在变量中,作为参数传递或结果返回

  • 3.Lua可以使用type函数测试给定变量或者值的类型

  • 4.Lua中有8个基本类型

    数据类型描述
    nil只有值nil属于该类,表示一个无效值(在条件表达式中相当于false
    booleanfalsetrue
    number表示双精度类型的实浮点数
    string字符串由一对双引号或单引号来表示
    functionCLua编写的函数
    userdata表示任意存储在变量中的C数据结构
    thread表示执行的独立线路,用于执行协同程序
    tableLua中的表table其实是一个关联数组associative arrays;数组的索引可以是数字、字符串或表类型;Luatable 的创建是通过构造表达式来完成,最简单构造表达式是{},用来创建一个空表

    在这里插入图片描述

1.nil(空)

  • 1.nil类型表示没有任何有效值,它只有一个值nil

  • 2.打印一个没有赋值的变量,便会输出一个nil

  • 3.对于全局变量和tablenil还有一个删除作用,将全局变量或table表里的变量赋nil值等同于删除

  • 4.nil作比较时应该加上双引号(type(X)==nil 结果为 false 的原因是 type(X) 实质是返回的nil字符串是一个 string 类型)

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

2.boolean(布尔)

  • 1.boolean类型只有两个可选值:true(真) 和 false(假)
  • 2.Luafalsenil看作是false,其他的都为true,数字0也是true
    在这里插入图片描述
    在这里插入图片描述

3.number(数字)

  • 1.Lua默认只有一种number类型 -> double(双精度)类型(默认类型可以修改luaconf.h里的定义)
    在这里插入图片描述
    在这里插入图片描述

4.string(字符串)

  • 1.字符串由一对双引号或单引号来表示
  • 2.或者使用2个方括号[[]]来表示一块字符串
  • 3.对一个数字字符串进行算术操作时,Lua会尝试将该数字字符串转换成一个数字
  • 4.字符串连接使用的是 ..
  • 5.使用#计算字符串的长度并且放在字符串前面
    在这里插入图片描述
    在这里插入图片描述

5.table(表)

  • 1.Luatable的创建是通过构造表达式来完成,最简单构造表达式是{},用来创建一个空表
  • 2.table也可以创建时在表里添加数据直接初始化表
  • 3.Lua中的表table其实是一个关联数组associative arrays,数组的索引可以是数字字符串(表类似集合)
  • 4.如果遍历则第一个参数默认为索引,第二个参数为value
  • 5.不同于其他语言的数组把0作为数组的初始索引,Lua 中表的默认初始索引以1开始
  • 6.table不会固定长度大小,有新数据添加时table长度会自动增长(注意:#只能统计索引为数字的长度),没初始的table都是nil
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

6.function(函数)

  • 1.Lua中函数被看作是第一类值First-Class Value,函数可以存在变量中
  • 2.function可以以匿名函数anonymous function的方式通过参数传递
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

7.thread(线程)

  • 1.Lua中最主要的线程是协同程序coroutine
  • 2.类似线程thread,拥有自己独立的栈、局部变量和指令指针
  • 3.可以跟其他协同程序共享全局变量和其他大部分东西
  • 4.线程跟协程的区别:线程可以同时多个运行,而协程任意时刻只能运行一个,并且处于运行状态的协程只有被挂起suspend时才会暂停

8.userdata(自定义类型)

  • 1.userdata是一种用户自定义数据,用于表示一种由应用程序或C/C++语言库所创建的类型
  • 2.其可以将任意C/C++的任意数据类型的数据(通常是 struct 和 指针)存储到Lua变量中调用

4.变量

  • 1.变量在使用前需要在代码中进行声明,即创建该变量
  • 2.编译程序执行代码之前编译器需要知道如何给语句变量开辟存储区,其用于存储变量的值
  • 3.Lua变量有三种类型
    • 1.全局变量
    • 2.局部变量
    • 3.表中的域
  • 4.变量的默认值均为nil
    在这里插入图片描述
    在这里插入图片描述

1.全局变量

  • 1.Lua中的变量全是全局变量,哪怕是语句块或是函数里,除非用local显式声明为局部变量
  • 2.Lua语言中,全局变量无须声明即可使用,使用未经初始化的全局变量不会导致错误
  • 3.当使用未经初始化的全局变量时,得到的结果为nil

2.局部变量

  • 1.只有使用local显式声明的才是局部变量
  • 2.局部变量的作用域为从声明位置开始到所在语句块结束
  • 3.尽可能的使用局部变量,有两个好处
    • 1.避免命名冲突
    • 2.访问局部变量的速度比全局变量更快

3.变量赋值

  • 1.Lua可对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量
  • 2.遇到赋值语句Lua会先计算右边所有的值然后再执行赋值操作,所以可以快捷交换变量的值
  • 3.当变量个数和值的个数不一致时,Lua会一直以变量个数为基础采取以下策略
    • 1.变量个数 > 值的个数 -> 按变量个数补足nil
    • 2.变量个数 < 值的个数 -> 多余的值会被忽略
  • 4.如果要对多个变量赋值必须依次对每个变量赋值
  • 5.多值赋值经常用来交换变量,或将函数调用返回给变量
  • 6.Lua对多个变量同时赋值,不会进行变量传递,仅做值传递
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

5.循环

  • 1.循环结构是在一定条件下反复执行某段程序的流程结构,被反复执行的程序被称为循环体
  • 2.循环语句是由循环体及循环的终止条件两部分组成的
    在这里插入图片描述

1.while循环

while(condition)
do
  statements
end
  • 1.Luawhile循环语句在判断条件为true时会重复执行循环体语句
  • 2.statements(循环体语句) 可以是一条或多条语句,condition(条件) 可以是任意表达式,当 condition(条件) 为true时执行循环体语句
    在这里插入图片描述
    在这里插入图片描述

2.for循环

  • 1.Luafor循环语句可以重复执行指定语句,重复次数可在for语句中控制
  • 2.Lua编程语言中for语句有两大类
    • 1.数值for循环
    • 2.泛型for循环
1.数值for循环
for var=exp1,exp2,exp3 do  
	<执行体>  
end  
  • 1.varexp1变化到exp2,每次变化以exp3为步长递增var,并执行一次 执行体
  • 2.其中exp3是可选的,如果不指定则默认值为1
  • 3.for的三个表达式在循环开始前一次性求值(例:函数f(x)只在循环开始前执行一次),以后不再进行求值
    在这里插入图片描述
    在这里插入图片描述
2.泛型for循环
--打印数组a的所有值  
a = {"one", "two", "three"}
for i, v in ipairs(a) do
   print(i, v)
end 
  • 1.泛型for循环通过一个迭代器函数来遍历所有值,类似java中的foreach语句
  • 2.i是数组索引值,v是对应索引的数组元素值。ipairsLua提供的一个迭代器函数,用来迭代数组
    在这里插入图片描述
    在这里插入图片描述

3.repeat…until循环

repeat
  statements
until( condition )
  • 1.Luarepeat...until循环语句不同于forwhile循环
  • 2.forwhile循环的条件语句在当前循环执行开始时判断,而 repeat...until循环的条件语句在当前循环结束后判断
  • 3.因为循环条件判断语句condition在循环体末尾部分,所以在条件进行判断前循环体都会执行一次
  • 4.如果条件判断语句conditionfalse,循环会重新开始执行,直到条件判断语句conditiontrue才会停止执行
    在这里插入图片描述
    在这里插入图片描述

4.嵌套循环

for init,max/min value, increment
do
  for init,max/min value, increment
  do
     statements
  end
  statements
end
while(condition)
do
  while(condition)
  do
     statements
  end
  statements
end
repeat
  statements
  repeat
     statements
  until( condition )
until( condition )

在这里插入图片描述
在这里插入图片描述

5.break语句

  • 1.Luabreak语句插入在循环体中,用于退出当前循环或语句,并开始执行紧接着的语句
  • 2.如果你使用循环嵌套,break语句将停止最内层循环的执行,并开始执行的外层的循环语句
    在这里插入图片描述
    在这里插入图片描述

6.goto语句

goto Label

-- Label 的格式
:: Label ::
  • 1.Lua中的goto语句允许将控制流程无条件地转到被标记的语句处
  • 2.lable中可以设置多个语句
  • 3.使用goto可以实现continue的功能
    在这里插入图片描述
    在这里插入图片描述

6.流程控制

  • 1.Lua控制语句通过程序设定一个或多个条件语句,条件为true时执行指定程序代码,条件为false时执行其他指定代码
  • 2.控制结构的条件表达式结果可以是任何值,Lua认为falsenil为假,true和非nil为真,且Lua0true
    在这里插入图片描述
    在这里插入图片描述

1.if语句

2.if…else语句

3.if 嵌套语句

模块与包

  • 1.模块类似于一个封装库,从Lua 5.1开始Lua加入了标准的模块管理机制
  • 2.模块可把一些公用的代码放在一个文件里,以API接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度
  • 3.Lua的模块是由变量、函数等已知元素组成的table
  • 4.因此创建一个模块很简单,就是创建一个table,然后把需要导出的常量、函数放入其中,最后返回这个table就行
  • 5.模块的结构就是一个table的结构,因此可以像操作调用table里的元素那样来操作调用模块里的常量或函数
  • 6.可使用local声明变量为程序块的局部变量,即表示一个私有函数,因此是不能从外部访问模块里的这个私有函数,必须通过模块里的公有函数来调用
    在这里插入图片描述

1.require函数

  • 1.Lua提供了一个require的函数用来加载模块
  • 2.执行require后会返回一个由模块常量或函数组成的table,并且还会定义一个包含该table的全局变量
  • 3.其中require中引用的是Lua的文件名,而不是模块名,全局变量引用的是模块名,而不是文件名
  • 4.可以加载的模块定义一个别名变量方便调用
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

3.加载机制

  • 1.对于自定义的模块,模块文件不是放在哪个文件目录都行,函数 require 有自己的文件路径加载策略
  • 2.其会尝试从Lua文件或C程序库中加载模块
  • 3.require用于搜索Lua文件的路径是存放在全局变量package.path
  • 4.当Lua启动后会以环境变量LUA_PATH的值来初始这个环境变量
  • 5.如果没有找到该环境变量,则使用一个编译时定义的默认路径来初始化
  • 6.如果找到目标文件,则会调用package.loadfile来加载模块,否则就会去找C程序库
  • 7.搜索的文件路径是从全局变量 package.cpath获取,而这个变量则是通过环境变量LUA_CPATH`来初始
  • 8.搜索策略跟上面的一样,只不过现在换成搜索的是sodll类型的文件,如果找到那么require会通过package.loadlib来加载

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式中屏幕能够显示汉字的原理方法

LCD是嵌入式常见设备&#xff0c;如何在LCD上显示汉字和英文&#xff1f;矢量字体和点阵字体有何不同&#xff1f;同一个字符为何有多种编码&#xff1f; GB2312、GB18030指什么&#xff1f;他们之间有关系吗&#xff1f;嵌入式设备如何支持多国语言&#xff1f;从哪里获取字库…

QGIS 矢量对齐工具-VectorBender

VectorBender 是一个QGIS Python 插件&#xff0c;允许转换矢量图层以匹配另一个几何图形。根据定义的输入点的数量&#xff0c;插件选择三种变换类型&#xff1a;平移、均匀或弯曲。 前两个允许快速对齐非地理参考数据&#xff0c;而第三个允许匹配具有复杂的非均匀和非线性变…

ElementUI 组件:Container 布局容器实例

ElementUI安装与使用指南 Container 布局容器 点击下载learnelementuispringboot项目源码 效果图 el-container-example.vue&#xff08;Container 布局容器实例&#xff09;页面效果图 项目里el-container-example.vue代码 <script> export default {name: el_cont…

【Spring Boot 源码学习】BootstrapRegistry 详解

《Spring Boot 源码学习系列》 BootstrapRegistry 详解 一、引言二、往期内容三、主要内容3.1 源码初识3.2 register 方法3.3 registerIfAbsent 方法3.4 isRegistered 方法3.5 getRegisteredInstanceSupplier 方法3.6 addCloseListener 方法3.7 InstanceSupplier 内部接口类3.7…

Python基础小知识:format函数用法

format优点 format是python2.6新增的一个格式化字符串的方法&#xff0c;相对于老版的%格式方法&#xff0c;它有很多优点。 1.不需要理会数据类型的问题&#xff0c;在%方法中%s只能替代字符串类型 2.单个参数可以多次输出&#xff0c;参数顺序可以不相同 3.填充方式十分灵…

【深入浅出SpringCloud原理及实战】「Netflix系列之Hystrix」针对于限流熔断组件Hystrix的回退降级实现方案和机制

针对于限流熔断组件Hystrix的回退降级实现方案和机制 依赖隔离依赖隔离之线程&线程池高延迟请求的例子 线程池的优势线程池的弊端线程池的开销线程池开销 信号量 依赖隔离 Hystrix通过使用『舱壁模式』&#xff08;注&#xff1a;将船的底部划分成一个个的舱室&#xff0c;…

项目01《游戏-03-开发》Unity2D

基于 项目01《游戏-02-开发》Unity2D &#xff0c; 继续制作游戏&#xff1a; 首先要做的时切割人物Idle空闲状态下的动画&#xff0c; 在切割之前我们需要创建一个文件夹&#xff0c;用来存放动画控制器AnimatorContoller&#xff0c; 再创建一个人物控制器文件夹…

沁恒微WCH32v003驱动ST7735S硬件spi+DMA调试小坑

最近项目需要&#xff0c;要用wch32v003驱动ST7735S&#xff0c;用硬件spiDMA方式可以提高屏幕刷新率&#xff0c;但是使用过程遇到一下问题&#xff0c;分享出来&#xff0c;有清楚的大佬可以指点指点。 这篇文章并不是给着急移植程序使用的人看的&#xff0c;因为在赶进度的时…

如果我要访问一个网址,那么在网络中会有哪些过程

访问一个网址是我们日常网络使用中非常常见的操作&#xff0c;背后涉及到一系列精密而复杂的步骤。这个过程包括DNS解析、建立TCP连接、发起HTTP请求、服务器处理请求、服务器响应、浏览器渲染等环节。在这篇文章中&#xff0c;我们将深入探讨这些步骤&#xff0c;并解释它们在…

力扣hot100 跳跃游戏 II 贪心 思维

Problem: 45. 跳跃游戏 II 思路 &#x1f468;‍&#x1f3eb; 参考 每次在上次能跳到的范围&#xff08;end&#xff09;内选择一个能跳的最远的位置&#xff08;也就是能跳到max_far位置的点&#xff09;作为下次的起跳点 &#xff01; Code ⏰ 时间复杂度: O ( n ) O(n…

猫什么时候发腮?性价比高的发腮主食冻干推荐

猫什么时候发腮&#xff1f;发腮是猫咪成长过程中一个重要的体征&#xff0c;也是猫父母们非常关心的问题。想要让猫咪拥有可爱的肉嘟嘟脸型&#xff0c;主人需要在适龄的年龄段加强营养补给&#xff0c;不要错失最佳发腮期。猫什么时候发腮呢&#xff1f;应该怎样喂养才能让猫…

TypeScript实战教程(一):表单上传与后端处理

TypeScript实战教程&#xff08;一&#xff09;&#xff1a;表单上传与后端处理 文章目录 TypeScript实战教程&#xff08;一&#xff09;&#xff1a;表单上传与后端处理一、前言1、TypeScript介绍2、TypeScript的关键特性包括&#xff1a;3、使用场景4、编译过程 二、环境配置…

张维迎《博弈与社会》多重均衡与制度和文化(1)多重均衡问题

什么是多重均衡 我曾经在课堂上做过这样一个实验&#xff1a;随机选择男女两位同学参加一个选数字的游戏。游戏的基本规则为&#xff1a;每一个同学随机地从1到10十个数字中任意选择5个。如果两人选择的数字没有任何重复的话&#xff0c;则每人可以得到50元&#xff1b;如果两人…

不同核函数高斯过程回归算法与不同因子输入情况下对长江流域蒸散发量应用研究_杨梓涵_2023

不同核函数高斯过程回归算法与不同因子输入情况下对长江流域蒸散发量应用研究_杨梓涵_2023 摘要关键词 0 引言1 材料与方法1.1 数据资料1.2 参考作物腾发量( ET0 ) 计算方法1.2.1 FAO&#xff0d;56 Penman&#xff0d;Monteith 模型1.2.2 Hargreaves&#xff0d;Samani 模型1.…

apisix多节点搭建

文章目录 前言一、介绍1. 端口介绍2. APISIX节点介绍3. apisix单机安装配置教程(选看) 二、准备1. 配置集群免密登录2. 搭建etcd集群 三、安装apisix节点1. 复制脚本2. 增加执行权限3. 分发脚本4. 执行脚本5. 配置apisix的etcd集群地址 四、安装apisix-dashboard1. 复制脚本2. …

【GEE】基于GEE批量下载Landsat8 L1C数据(整幅)

之前发过一篇使用GEE下载Landsat8的文章&#xff0c;然后有很多小伙伴私信我各种问题&#xff0c;如L1C、L2数据代码怎么修改&#xff0c;如何镶嵌&#xff0c;如何去云、 如何裁剪等一系列问题。正好快过年了&#xff0c;手头的事也没有多少了&#xff0c;所以这两天整理了一下…

蜂邮EDM邮件营销平台,低至0.0041元每封!

推荐的邮件营销平台有哪些&#xff1f;邮件营销平台如何使用&#xff1f; 你是否厌倦了传统的推广方式&#xff1f;是时候尝试一种全新的、高效的传播方式了&#xff01;蜂邮EDM邮件营销平台正在掀起一场数字化风潮&#xff0c;每封邮件仅需0.0041元&#xff0c;让你的推广成本…

5款超级好用的桌面端软件推荐

​ 今天我想分享一些自己比较喜欢的桌面端软件&#xff0c;还请大家包涵指正。如果你曾搜索过 Windows效率工具推荐&#xff0c;对下文的软件或许有所了解。不过为了凑字数&#xff0c;我还是会再介绍一遍。 1.电子书阅读——Starrea ​ Starrea是一款轻量、易用而又全功能的…

C#/.NET/.NET Core优秀项目和框架2024年1月简报

前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架&#xff08;每周至少会推荐两个优秀的项目和框架当然节假日除外&#xff09;&#xff0c;公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等&#xff08;打不开或者打开GitHub很慢的同学…

[Python-闫式DP]

闫式DP分析法 闫老师是将DP问题归结为了有限集合中的最值问题。 动态规划有两个阶段&#xff0c;一是状态表示&#xff0c;二是状态计算。 状态表示 f(i,j) 状态表示是一个化零为整的过程&#xff0c;动态规划的做题思路不是暴力法的每一个物品都去枚举&#xff0c;而是将相…