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(...)
	do
        print(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)
do
	print("k = " .. k);
	print("v = " .. v);
end;

7、循环结构

for循环

语法格式

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

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

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

例如:

-- 打印1到10

for a = 1, 10, 1
do
    print(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 ) do
    print(i, v)
end;

while循环

语法格式:

while(condition)
do
   statements
end;

do while循环

语法格式:

repeat
   statements
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.mfbz.cn/a/39286.html

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

相关文章

前端 mock 数据的几种方式

目录 接口demo Better-mock just mock koa webpack Charles 总结 具体需求开发前&#xff0c;后端往往只提供接口文档&#xff0c;对于前端&#xff0c;最简单的方式就是把想要的数据写死在代码里进行开发&#xff0c;但这样的坏处就是和后端联调前还需要再把写死的数据…

大小端模式

文章目录 一、概念二、举例三、判大小端和交换 一、概念 大端模式&#xff08;Big-endian&#xff09;&#xff0c;是一种数据存储方式&#xff0c;其中较高的字节&#xff08;最高有效字节&#xff09;存储在较低的内存地址&#xff0c;较低的字节&#xff08;最低有效字节&am…

开发跨平台APP,是用Flutter还是React Native开发框架?

随着移动互联网的飞速发展&#xff0c;对于开发人员而言&#xff0c;如何快速地开发出兼容不同平台&#xff08;iOS、Android&#xff09;的应用&#xff0c;成为了一个重要的问题。 跨平台应用程序开发框架的好处&#xff1a; 1. 一个App适用于多个设备&#xff1b; 2. 一个…

数据结构 ~ 树

什么是树 - tree 一种分层数据的抽象模型&#xff1b; 如&#xff1a;DOM、级联选择、树形控件&#xff0c;js 中没有树 可以用 Object 构建树&#xff1a; const tree {val: a,children: [{val: a-1,children: [{val: a-1-1,children: []}]},{val: a-2,children: [{val: a…

chatGPT指令大全可免费使用网站列表chatGPT4试用方案

指令列表 写作助理 &#x1f449; 最常使用的 prompt&#xff0c;用于优化文本的语法、清晰度和简洁度&#xff0c;提高可读性。作为一名中文写作改进助理&#xff0c;你的任务是改进所提供文本的拼写、语法、清晰、简洁和整体可读性&#xff0c;同时分解长句&#xff0c;减少…

剑指offer刷题笔记--Num51-60

1--数组中的逆序对&#xff08;51&#xff09; 主要思路&#xff1a; 基于归并排序&#xff0c;视频讲解参考&#xff1a;数组中的逆序对 #include <iostream> #include <vector>class Solution { public:int reversePairs(std::vector<int>& nums) {if(…

JavaWeb 前后端分离

AJax 1. 前端视图 ajax\src\main\webapp\ajax-register.html <html><head><meta charset"UTF-8"> </head><body><form class"form-horizontal" role"form"><div><tr><td>账号</td&…

6款好用的在线原型图设计工具推荐

在线原型图的核心功能是可视化需求&#xff0c;因此一个易于使用的在线原型图工具对原型图设计至关重要。对于熟悉的Photoshop和iIlustrator来说&#xff0c;虽然它们功能强大&#xff0c;但界面太复杂&#xff0c;初学者很难快速启动&#xff0c;面对批量调整的在线原型图&…

Allegro过孔盖油和过孔开窗设置(部分过孔开窗)

Allegro设置一部分过孔盖油&#xff0c;另一部分过孔开窗。 过孔开窗&#xff1a;过孔部分去除阻焊&#xff0c;便于调试和散热&#xff1b; 过孔盖油&#xff1a;过孔盖上阻焊油墨&#xff0c;防止过孔连锡短路。 总结 使用pad designer设计两种via pad&#xff0c;一种不开…

STM32案例学习 GY-39环境监测传感器模块

STM32案例学习 GY-39环境监测传感器模块 硬件平台 野火STM32F1系列开发板正点STM32F1系列开发板STM32F103ZET6核心板GY-39环境监测传感器模块 GY-39环境监测传感器模块 GY-39 是一款低成本&#xff0c;气压&#xff0c;温湿度&#xff0c;光强度传感器模块。工作电压 3-5v…

【JavaEE】HTTP请求的构造

目录 1、通过form表单构造HTTP请求 2、通过JS的ajax构造HTTP请求 3、Postman的安装和简单使用 常见的构造HTTP请求的方式有一下几种&#xff1a; 直接通过浏览器的地址栏&#xff0c;输入一个URL&#xff0c;就可以构造一个GET请求HTML中的一些特殊标签&#xff0c;也会触发…

网工内推 | 美图秀秀招网工,大专以上,15薪,NP认证优先

01 美图公司 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、美图大厦网络、分公司网络、IT相关项目的网络、办公内网服务器&#xff1b; 2、负责网络的设计、运行、管理和维护等工作&#xff1b; 3、负责远程办公环境的优化、运行、管理和维护工作&#xff1b; 4、…

二级市场负重前行?腾讯音乐的“新伤”与“旧患”

炎炎夏日的7月&#xff0c;于腾讯音乐&#xff08;NYSE:TME、HK:01698&#xff09;而言并不太平。 先是&#xff0c;在7月5日&#xff0c;企鹅FM发布官方公告称由于业务调整&#xff0c;将于9月6日正式停止运营。 仅过十二天&#xff0c;7月17日&#xff0c;腾讯音乐发布公告&…

勒索花样繁多,“Sophos Encrypt”披马甲进行勒索攻击

近日&#xff0c;网络安全供应商Sophos发表声明&#xff0c;称Sophos被一款名为“Sophos Encrypt”新型勒索软件冒充&#xff0c;该勒索软件进行攻击时会冒用Sophos品牌名称&#xff0c;并将用户重要文件进行加密以勒索赎金。 现在的勒索软件类型多样&#xff0c;令企业防不胜防…

Windows搭建Nginx实现RTMP转为HLS流

所需软件 nginx-1.7.11.3-Gryphon&#xff08;这个包含必须的RTMP模块&#xff0c;普通的Ngxin没有这个&#xff09;ffmpegVLC 配置Nginx 1为Nginx配置RTMP和HLS 这里定义了一个叫live的RTMP路径。同时设置其开启HLS功能&#xff0c;那么所有推送到这个地址的RTMP流都会自动生…

【Apifox】国产测试工具雄起

在开发过程中&#xff0c;我们总是避免不了进行接口的测试&#xff0c; 而相比手动敲测试代码&#xff0c;使用测试工具进行测试更为便捷&#xff0c;高效 今天发现了一个非常好用的接口测试工具Apifox 相比于Postman&#xff0c;他还拥有一个非常nb的功能&#xff0c; 在接…

编程小白的自学笔记九(python爬虫入门+代码详解)

系列文章目录 编程小白的自学笔记八&#xff08;python中的多线程&#xff09; 编程小白的自学笔记七&#xff08;python中类的继承&#xff09; 编程小白的自学笔记六&#xff08;python中类的静态方法和动态方法&#xff09; 编程小白的自学笔记五&#xff08;Python类的…

Navicat分配子用户及权限管理

一、创建用户&#xff0c;分配权限 新建用户 输入要创建的子用户的信息 主机名 表示访问本服务的方式&#xff0c;%表示即可以本机访问&#xff0c;也可以远程访问 之后&#xff0c;我们给创建的用户分配权限&#xff08;在该数据库的可操作空间&#xff09; 为用户分配增删改…

SPEC CPU 2017 1.0.5 不同版本CentOS 7 8 安装笔记

CentOS 7.9.2009 x86_64 gcc版本 安装成功 runcpu编译报错 gcc版本太低&#xff0c;不识别-fno-tree-loop-vectorize 去掉config/gcc.cfg中 -fno-tree-loop-vectorize编译优化参数。 用例编译中 CentOS 8.3.2011 x86_64 gcc版本 安装失败&#xff0c;需要自行编译tools 手动…

Visual Studio 自定义的颜色字体不生效

问题描述&#xff1a; 1、dll1中引用第三方库的类不识别&#xff0c;颜色黑白&#xff0c;自定义颜色不生效&#xff1b;定义的是结构体 2、在dll2引用另一个dll1中的结构体。结构体不识别&#xff0c;今天成员函数cpp中自定义颜色不生效。 问题解决方式&#xff1a; 全部清…
最新文章