lua脚本语言学习笔记

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

因为我们使用redis的时候一般要写lua脚本,这篇文章就介绍一下lua脚本语言的基础用法。

一、安装Lua

window操作系统下可以使用SciTE来执行lua程序,SciTE是一个代码编辑器和集成开发环境,类似IntelliJ IDEA。点击以下链接下载SciTE:

https://github.com/rjpcomputing/luaforwindows/releases

点击上方链接打开页面,点击红框内链接下载SciTE

这是github的链接,可能访问很慢或者无法访问,可以通过以下网盘链接下载。

下载Luahttps://pan.baidu.com/s/1lsWURBHR2gmFvD0uL6xplw?pwd=yxzv安装过程很简单,一直下一步就行了,注意在安装过程中勾选创建桌面快捷方式。安装后,桌面多了一个图标

鼠标双击这个快捷方式打开SciTE,第一次打开的时候页面是这样的,我们在下面空白的地方输入以下代码

print("Hello world");

 然后Ctrl+S保存当前文件,文件名设置成hello.lua,为了方便,把这个文件保存到桌面

 保存之后,发现第二排的工具栏图标多了一个运行按钮,点击它就可以运行代码了

好了,上面已经介绍了SciTE这款代码编辑器的使用,接下来介绍lua语言的基础语法。

二、lua基础语法

1、代码注释

lua支持单行注释和多行注释

单行注释的写法

--这是注释

多行注释的写法

--[[
这是多行注释
这是多行注释
这是多行注释
--]]

2、标识符

lua语言的标识符命名规则和其他语言类似

  • 变量名以字母或下划线 _ 开头,只能包含字母、数字和下划线。
  • 最好不要使用下划线加大写字母的标示符,因为Lua的保留字就是这样命名的。
  • 一般约定,以下划线开头连接一串大写字母的名字(比如 _VERSION)被保留用于Lua内部的全局变量。

3、关键字

下面是Lua的保留关键字,保留关键字不能作为常量或变量或其他用户自定义标示。

andbreakdoelse
elseifendfalsefor
functionifinlocal
nilnotorrepeat
returnthentrueuntil
whilegoto

4、变量的定义

lua中的变量定义不像java要声明类型,只需要写:变量名=变量值;在这一点上,lua和python是一样的。

全局变量:lua中的变量默认是全局的,比如

str = "Hello world";print(str);

局部变量:使用local关键字修饰的变量,比如

func = function()local a = 1;
end;print(a);

这个时候a是访问不到的,相当于未定义的变量,而我们lua是允许访问未定义的变量的,只是值为nil,类似java的null。

5、变量的赋值

lua中变量的赋值也是用等号,但是lua支持一次给多个变量赋值。

例如,同时给a、b、c赋值

a, b, c = 1, 2, 3;print(a);
print(b);
print(c);

变量和值的顺序一一对应,这样的话,就有可能变量的个数和值的个数不一致

  • 当变量的个数>值的个数时,没有赋值的对应变量的值默认为nil,这点倒是和java很像
  • 当变量的个数<值的个数时,多余的值会被忽略;

注意:lua的字符串拼接和java不一样,lua使用..来拼接两个字符串。例如:

a = "Hello ";print(a .. "world");

因为Lua赋值语句会先计算右边所有的值然后再执行赋值操作,所以我们可以这样交换变量的值:

a = 1;
b = 2;a, b = b, a;print("a = " .. a);
print("b = " .. b);

 代码运行结果:

6、数据类型

lua中有八大数据类型,作为初学者,我们能用上的也就只有:nil、boolean、string、function、table

数据类型描述
nil这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。
boolean包含两个值:false和true。
number数字类型,包含整数和小数
string字符串,由一对双引号或单引号来表示
function函数
userdata表示任意存储在变量中的C数据结构
thread表示执行的独立线路,用于执行协同程序
tableLua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。

可以通过type()函数来获取变量的类型,例如:

a = 1;
b = "abc";
c = function()print("这是函数");
end;
d = true;
e = {name = "Marry", age = 18};print(type(a));
print(type(b));
print(type(c));
print(type(d));
print(type(e));

以上代码的运行结果:

6.1 function的说明

  • 函数和变量一样,可以指定作用域,不指定则默认为全局函数,可以使用local关键字设置为局部函数
  • Lua的函数可以接受可变数目的参数,在函数的参数列表中使用...表示函数有可变的参数。当参数中有固定参数和可变参数时,可变参数要放到最后。
func = function(...)for k, v in pairs(...)doprint(v);end;
end;func({"a", "b", "c"});
  • 函数可以返回多个值,每个值以逗号隔开
  • function可以作为函数的参数传递
func = function(a, fun)print(q);fun();
end;func(a, function()print("函数作为参数传递");
end);

6.2 table的介绍

其他4种数据类型很简单,主要是介绍一下table,这个类似数组,又类似对象的数据类型。

table的写法:{field = value, field2 = value2}

当然,table可以是一个镶嵌的结构,里面的值也可以是一个table

tab = {name = "Tom", age = 18, hobby = {"eat", "drink", "sleep"}}

案例代码: 注意,table的下标是从1开始的

 table里面的字段可以通过两种方式获取:

  • 变量名[字段名]
  • 变量名.字段名
tab = {name = "Marry", age = 18};print(tab["name"]);
print(tab.name);
print(tab["age"]);
print(tab.age);

代码运行结果:

 

6.3 table的遍历

tab = {name = "Marry", age = 18};for k, v in pairs(tab)
doprint("k = " .. k);print("v = " .. v);
end;

7、循环结构

for循环

语法格式

for var = exp1, exp2, exp3
do  -- 循环体
end;

变量var从exp1变化到exp2,每次变化以 exp3 为步长递增var,并执行一次循环体。

exp3 是可选的,如果不指定,默认为1。

例如:

-- 打印1到10for a = 1, 10, 1
doprint(a);
end;

补充:泛型for循环

泛型for循环通过迭代器函数pairs()或ipairs()来遍历所有值,类似 java 中的 foreach 语句。

Lua 编程语言中泛型 for 循环语法格式:

-- 输出所有水果fruits = {"apple", "banana", "pineapple", "pear", "watermalon", "plum", "cherry", "kiwi fruit", "strawberry"}for i, v in ipairs(fruits ) doprint(i, v)
end;

while循环

语法格式:

while(condition)
dostatements
end;

do while循环

语法格式:

repeatstatements
until(condition);

8、分支结构

if...else语句

if(布尔表达式)
then--[布尔表达式为true时执行该语句块--]else--[布尔表达式为false时执行该语句块--]end;

if...else if...else语句

if(布尔表达式1)
then--[ 在布尔表达式1为true时执行该语句块--]elseif(布尔表达式2)
then--[ 在布尔表达式2为true时执行该语句块--]elseif(布尔表达式3)
then--[在布尔表达式3为true时执行该语句块--]else --[如果以上布尔表达式都不为true则执行该语句块--]end;

9、lua常用函数

print():在控制台输出指定的值,该函数可以有多个参数。

print("Hello ", "world");

string.find():返回匹配串开始和结束的下标,如果不存在匹配串返回nil。

start, finish = string.find("hello world", "hello");print(start, finish); -- 1 5

select("#", ...):获取可变参数的长度

-- 获取参数个数
function getLength(...)return select("#", ...);
end;print(getLength("a", "b", "c", "d", "e"));

select(n, ...):返回从起点n开始到结束位置的所有参数列表。

print(select(3, "a", "b", "c", "d", "e")); -- c d e

10、算术运算符

lua相对于java多了一个整除运算符

操作符描述
+加法
-减法
*乘法
/除法
%取余
^乘幂
-负号
//整除运算符(>=lua5.3)

11、关系运算符

lua相对于java,不等于的运算符有一点区别

  • Java中不等于是!=
  • Lua中的不等于是~=
操作符描述
==等于,检测两个值是否相等,相等返回 true,否则返回 false
~=不等于,检测两个值是否相等,不相等返回 true,否则返回 false
>大于,如果左边的值大于右边的值,返回 true,否则返回 false
<小于,如果左边的值大于右边的值,返回 false,否则返回 true
>=大于等于,如果左边的值大于等于右边的值,返回 true,否则返回 false
<=小于等于, 如果左边的值小于等于右边的值,返回 true,否则返回 false

12、逻辑运算符

操作符描述
and逻辑与操作符。 若 A 为 false,则返回 A,否则返回 B。
or逻辑或操作符。 若 A 为 true,则返回 A,否则返回 B。
not逻辑非操作符。与逻辑运算结果相反,如果条件为 true,逻辑非为 false。

13、其他运算符

操作符描述
..连接两个字符串
#一元运算符,返回字符串或表的长度。

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

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

相关文章

旅行社优惠卡app软件开发

旅游行业的不断发展&#xff0c;越来越多的旅行社开始推出各种优惠卡来吸引游客。而随着智能手机的普及&#xff0c;开发一款旅行社优惠卡APP软件成为了一种必然的趋势。 该软件的主要功能是提供旅行社的各种优惠卡信息&#xff0c;包括优惠卡的种类、价格、使用范围、有效…

Pytorch如何打印与Keras的model.summary()类似的输出

1 Keras的model.summary() 2 Pytorch实现 2.1 安装torchsummary包 pip install torchsummary2.2 代码 import torch import torch.nn as nn import torch.nn.functional as F from torchsummary import summaryclass Net(nn.Module):def __init__(self):super(Net, self).__…

【Spring Boot学习一】创建项目 Spring Boot的配置文件

目录 一、安装插件 二、创建Spring Boot项目 1、创建项目 1.1 使用IDEA创建 1.2 网页版本创建 2、项目目录介绍与运行 三、Sping Boot的配置文件&#xff08;重点&#xff09; &#x1f337;1、.properties配置文件 &#xff08;1&#xff09;基础语法&#xff1a;Key …

我在VScode学Java类与对象(Java显式参数和隐式参数、静态方法+main方法、Java访问修饰符、static关键字、Java的包、对象数组)第三辑

我的个人博客主页&#xff1a;如果’真能转义1️⃣说1️⃣的博客主页 关于Java基本语法学习---->可以参考我的这篇博客&#xff1a;《我在VScode学Java》 续《我在VScode学Java&#xff08;Java的类与对象&#xff09;》 方法会操作对象并访问他们的实例字段。 伍._. 显式参…

elementUI el-radio 无法点击的问题

<el-form-item label"B端客户类型" prop"user_type"><template slot"label"><span>B端客户类型</span><el-tooltip effect"dark" placement"top" content"B端大客户账期有效,只有设置该类型…

javascript实现久久乘法口诀表、document、write、console、log

文章目录 正序乘法口诀表倒序乘法口诀表logconsoledocumentwrite 正序乘法口诀表 function multiplicationTable() {for (let i 1; i < 9; i) {let val ;for (let j 1; j < i; j) {document.write(j * i (i * j) &nbsp );val ${j}*${i}${i * j} ;}consol…

Vue第三篇:最简单的vue购物车示例

本文参考&#xff1a;Vue Cli&#xff08;脚手架&#xff09;实现购物车小案例 - - php中文网博客 效果图&#xff1a; 编写流程&#xff1a; 1、首先通过vue/cli创建工程 vue create totalprice 2、改写App.vue代码如下&#xff1a; <template><div><div v…

深入浅出对话系统——基于预训练语言模型的对话管理

引言 主要讲解三篇论文&#xff0c;主要思想是把自然语言理解、对话管理和自然语言生成三部分整合到一起。 先导知识 数据集 CamRest676MultiWOZ 都是用的自回归语言模型 causalGPT-2、Transformer Decoder 一个概念&#xff1a;delexicalization 通过相应的占位符替换…

基于IMX6ULL的AP3216C的QT动态数据曲线图显示

前言&#xff1a;本文为手把手教学 LinuxQT 的典型基础项目 AP3216C 的数据折线图显示&#xff0c;项目使用正点原子的 IMX6ULL 阿尔法( Cortex-A7 系列)开发板。项目需要实现 AP3216C 在 Linux 系统下的驱动&#xff0c;使用 QT 设计 AP3216C 的数据显示页面作为项目的应用层。…

websocket发布到iis之后无法创建连接访问

在做websocket测试时在本地的服务可以正常访问&#xff0c;在调试成功之后发布到了iis中&#xff0c;发现无法连接&#xff0c;这时可能有以下几个原因。 WebSocket无法连接到IIS&#xff1a; IIS版本不支持WebSocket&#xff1a;IIS 8.0及更高版本才支持WebSocket&#xff0…

从小白到大神之路之学习运维第61天--------Ansible自动化运维工具(playbook配置文件深入了解)

第三阶段基础 时 间&#xff1a;2023年7月14日 参加人&#xff1a;全班人员 内 容&#xff1a; playbook配置文件 目录 playbook配置文件 一、playbook配置文件概念 修改hosts文件 建立playbook配置文件 yml脚本写法注释&#xff1a; 二、Playbook的核心元素 三、…

如何破解中小企业数字化转型难点?建议来了!

打开任何一个搜索引擎&#xff0c;只要输入“中小企业数字化转型”&#xff0c;关于痛点、难处的文章就会铺面而来&#xff0c;难在哪里&#xff0c;其实很好解答&#xff0c;关键在于&#xff0c;如何解决这一个个难处。 PS&#xff1a;给大家整理了一份完整版的《中小企业如…

汽车供应链专场对接会 | 8月25日大会同期活动

爱普搜汽车供应链对接会&#xff0c;是根据采购商的项目需求&#xff0c;有针对性地组织全国各地采购商与供应商&#xff0c;进行面对面交流与沟通&#xff0c;促成实质性交易。参会群体为汽车行业制造型企业、主机厂、Tier1/2。 供应商在参加对接会前已做足功课&#xff0c;现…

C语言-ubuntu下的命令

目录 linux命令 【1】打开关闭终端 【2】终端 【3】ls命令 【4】cd 切换路径 【5】新建 【6】删除 【7】复制 【8】移动 【9】常用快捷键 【10】vi编辑器 【11】简单编程步骤 任务&#xff1a; linux命令 【1】打开关闭终端 打开终端&#xff1a; 1. 直接点击 …

File格式转换MultipartFile格式的例子

首先&#xff1a;需要先引入依赖包 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.3.9</version> </dependency> 1.Multipartfile转File类型 //创建一…

一零六四、世界杯数据可视化分析(阿里云天池赛)

目录 赛制官方链接 活动背景 活动时间&#xff1a;即日起-12月31日17点 数据说明 世界杯成绩信息表&#xff1a;WorldCupsSummary 世界杯比赛比分汇总表&#xff1a;WorldCupMatches.csv 世界杯球员信息表&#xff1a;WorldCupPlayers.csv 代码实现 赛制官方链接 世界杯…

视频融合平台EasyCVR登录后通道数据及菜单栏页面显示异常的排查与解决

EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有GB28181、RTSP/Onvif、RTMP等&#xff0c;以及厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等&#xff0c;能对外分发RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。 有用…

docker基础1——架构组成、安装配置

文章目录 一、发展起源1.1 传统虚拟化与容器虚拟化1.2 docker底层核心技术1.2.1 命名空间1.2.2 控制组 1.3 docker工作方式1.4 docker容器编排1.5 docker优劣势1.6 docker架构组成 二、yum安装docker三、配置docker加速器 一、发展起源 背景了解&#xff1a; 容器是内核里的一项…

上市公司前端开发规范参考

上市公司前端开发规范参考 命名规则通用约定文件与目录命名HTML命名CSS命名JS命名 代码格式通用约定HTML格式CSS格式JS格式注释 组件组件大小单文件组件容器组件组件使用说明Prop指令缩写组件通讯组件的挂载和销毁按需加载第三方组件库的规定 脚手架使用规范移动端脚手架PC端脚…

前端 Jenkins 自动化部署

由于公司使用自己搭建的 svn 服务器来进行代码管理&#xff0c;因此这里 Jenkins 是针对 svn 服务器来进行的配置&#xff0c;其实跟Git 配置基本一致。 在没有自动化部署前 之前项目每次修改之后都需要本地 ​​npm run build ​​一次手动发布到服务器上方便测试和产品查看…