lua脚本的基础内容

news2024/11/24 12:59:11

官方地址:http://luajit.org/
官方wiki地址:http://wiki.luajit.org/Home
推荐书籍:
OpenResty 最佳实践:https://moonbingbing.gitbooks.io/openresty-best-practices/content/
lua基础文档:https://www.runoob.com/lua/lua-tables.html,Lua 教程_w3cschool
lua中文文档:https://www.runoob.com/manual/lua53doc/ 
nginx中文文档:https://www.nginx.cn/doc/
nginx官方文档:http://nginx.org/en/docs/
nginx lua扩展文档:https://www.nginx.com/resources/wiki/modules/lua/
opm官方网站:https://opm.openresty.org/

1.简介

Lua 是一门扩展式程序设计语言,被设计成支持通用过程式编程,并有相关数据描述设施。 同时对面向对象编程、函数式编程和数据驱动式编程也提供了良好的支持。 它作为一个强大、轻量的嵌入式脚本语言,可供任何需要的程序使用。 Lua 由 clean C(标准 C 和 C++ 间共通的子集) 实现成一个库。

作为一门扩展式语言,Lua 没有 "main" 程序的概念: 它只能 嵌入 一个宿主程序中工作, 该宿主程序被称为 被嵌入程序 或者简称 宿主 。 宿主程序可以调用函数执行一小段 Lua 代码,可以读写 Lua 变量,可以注册 C 函数让 Lua 代码调用。 依靠 C 函数,Lua 可以共享相同的语法框架来定制编程语言,从而适用不同的领域。 Lua 的官方发布版包含一个叫做 lua 的宿主程序示例, 它是一个利用 Lua 库实现的完整独立的 Lua 解释器,可用于交互式应用或批处理。

Lua 编程的细节介绍, 请参阅 Roberto 的书,Programming in Lua

Lua 是一种轻量小巧的脚本语言,用标准 C 语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中, 从而为应用程序提供灵活的扩展和定制功能。
用途:
1. Redis+nginx+lua 脚本的限流方案
2. redis 中嵌入 lua 脚本
3. 游戏
4. 配合 nginx redis 做网页数据缓存
Lua脚本的优势:
1. 轻量级
2. 扩展性好
3. 功能全
2.Lua脚本的安装:
1. 下载lua脚本安装包: http://www.lua.org/ftp/lua-5.4.3.tar.gz
2. 解压安装包 检查依赖是否安装:
yum install gcc gcc-c++ automake autoconf libtool make gd gd-devel libxslt-devel tar –zxvf lua-5.4.3.tar.gz
3. 编译安装
make linux test
make install

3.变量与数据类型

Lua 标示符用于定义一个变量,函数获取其他用户定义的项,标识符的定义也具备 一些规则,具体如下: 1. 标示符以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上0个或多个字母,下 划线,数字(0到9)。

2. 最好不要使用下划线加大写字母的标示符,因为Lua的保留字也是这样的

3. Lua 不允许使用特殊字符如 @, $, 和 % 来定义标示符

Lua中的关键词:

nil这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。

变量在使用前,必须在代码中进行声明,即创建该变量。编译程序执行代码之前编译器需要知道如何给语句变量开辟存储区,用于存储变量的值。

Lua 变量有三种类型:全局变量、局部变量、表中的域。

Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。

局部变量的作用域为从声明位置开始到所在语句块结束。

变量的默认值均为 nil。

Lua的数据类型:

Lua是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。

4.数组与表

数组概念:

数组,就是相同数据类型的元素按一定顺序排列的集合,可以是 一维数组和多维数组。

Lua 数组的索引键值可以使用整数表示,数组的大小不是固定的。

数组定义:

一维数组是最简单的数组,其逻辑结构是线性表。一维数组可以用for 循环出数组中的元素,如下实例:
 

array = {"Lua", "Tutorial"}

for i= 0, 2 do

        print(array[i])

end
表定义:

table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数字、字典等。 Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil。 Lua table 是不固定大小的,你可以根据自己需要进行扩容。

-- 初始化表
mytable = {} 
-- 指定值
mytable[1]= "Lua" 
-- 移除引用
mytable = nil 
-- lua 垃圾回收会释放内存
表的操作:
序号方法 & 用途
1table.concat (table [, step [, start [, end]]]):

concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(step)隔开。

2table.insert (table, [pos,] value):

在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾.

3table.maxn (table)

指定table中所有正数key值中最大的key值. 如果不存在key值为正数的元素, 则返回0。(Lua5.2之后该方法已经不存在了,本文使用了自定义函数实现)

4table.remove (table [, pos])

返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起。

5table.sort (table [, comp])

对给定的table进行升序排序。

5.流程控制

If语句:

Lua 编程语言流程控制语句通过程序设定一个或多个条件语句来设定。在 条件为 true 时执行指定程序代码,在条件为 false 时执行其他指定代码。

If语法:
if(布尔表达式) then 
--[ 在布尔表达式为 true 时执行的语句 --] 
end
if(布尔表达式) 
then 
--[ 布尔表达式为 true 时执行该语句块 --] 
else 
--[ 布尔表达式为 false 时执行该语句块 --] 
end
--[ 定义变量 --]
a = 10;

--[ 使用 if 语句 --]
if( a < 20 )
then
   --[ if 条件为 true 时打印以下信息 --]
   print("a 小于 20" );
end
print("a 的值为:", a);
FOR循环:

很多情况下我们需要做一些有规律性的重复操作,因此在程序中就需要重复执行某些语句。一组被重复执行的语句称之为循环体,能否继续重复,决定循环的终止条件。 循环结构是在一定条件下反复执行某段程序的流程结构,被反复执行的程序被称为循环体。循环语句是由循环体及循环的终止条件两部分组成的。

FOR语法:
for var=exp1,exp2,exp3 do 
<执行体> 
end 
--打印数组a的所有值
for i,v in ipairs(a) do 
print(v) 
end 

--for循环
--a = {"a","c","d"}
--for i,j in ipairs(a) do
--    --print(i)
--    print(j)
--end
----表达式的前面一个值是key,后者是值
While循环:
while(condition) 
do 
statements 
end

statements(循环体语句) 可以是一条或多条语句

condition(条件) 可以是任意表达式

在 condition(条件) 为 true 时执行循环体语句

--while循环
--i = 1
--while (i > 10)
--do
--    i = i+1
--    print(i)
--end
Lua repeat…until 循环

Lua 编程语言中 repeat...until 循环语句不同于 for 和 while循环,for 和 while循环d 的条件语句在当前循环执行开始时判断,而 repeat...until 循环的条件语句在当前循环 结束后判断。

repeat 
statements 
until( condition )

statements(循环体语句) 可以是一条或多条语 condition(条件) 可以是任意表达式,在 condition(条件) 为 true 时执行循环体语句。 在condition(条件)为 false 时会跳过当前循环并开始脚本执行紧接着的语句。

--repeat ... until()循环
--i = 1
--repeat
--    i = i+1
--    print(i)
--until (i > 10)

资源下载地址:lua-5.4.3.tar.gz资源-CSDN文库

lua学习笔记(1)----lua开发环境的搭建 lua代码编译出可执行文件_lua编译成可执行程序-CSDN博客

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

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

相关文章

mac电脑修改终端zsh显示的用户名

电脑名称一直没有修改&#xff0c;所以电脑名称都是Apple的MacBook Pro&#xff0c;如下图所示&#xff1a; mac电脑终端显示用户名太长一点也不美观&#xff0c;而且占用很长的行&#xff0c;浪费空间&#xff0c;可以通过修改来调整要显示什么内容&#xff1a; 方式一 要想换…

解决Linux中Eclipse启动时找不到Java环境的问题

按照报错的意思是没有在/usr/local/eclipse/jre/bin/java下找到java环境&#xff0c;我检查了一下eclipse的目录结构发现在/usr/local/eclipse没有jre/bin/java&#xff0c;我的想法是自己建对应文件夹然后软连接到我的java环境 cd /usr/local/eclipse sudo mkdir jre cd jre s…

Java中为什么只有值传递?

Java中为什么只有值传递&#xff1f; 对于对象参数而言&#xff0c;实际参数传递给形式参数的只是一个内存地址&#xff0c;让形式参数也指向实际参数所指向的地址&#xff0c;传递的值的内容是对象的引用。 为什么会是这样&#xff1f;让我慢慢为你讲解。 对于Java的传递类…

自定义协议

应用层 有许多现成的协议(HTTP协议做网站必备),也有许多需要程序员自定义的协议. 1.自定义协议 自定义协议: 1.明确传递的信息是什么 2.约定好信息按照什么样的格式来组织成二进制字符串 举个例子: 当我们点外卖时,打开软件,会显示商家列表,列表中有很多项,每一项都包含了一…

波奇学Linux:线程安全和自选锁和读写锁

STL不是线程安全的 单例模式的线程安全 自选锁&#xff1a;当线程申请锁失败时&#xff0c;不是挂起&#xff0c;而是一直申请 挂起等待锁 &#xff1a;当线程申请锁失败时&#xff0c;把锁挂起 一般临界区时间短的适合自选锁&#xff0c;长的适合挂起等待锁

前后端分离:现代Web开发的协作模式

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

android中单例模式为什么会引起内存泄漏?

单例模式使用不恰当会造成内存泄漏。因为单例的静态特性使得单例的生命周期和应用的生命周期一样长&#xff0c; 如果一个对象已经不需要使用了&#xff0c;但是单例对象还持有该对象的引用&#xff0c;那么这个对象就不能被正常回收&#xff0c;因此会导致内存泄漏。 举个例子…

MySQL语法分类 DDL(1)

DDL&#xff08;1&#xff09;(操作数据库、表) 数据库操作(CRUD) C(Create):创建 //指定字符集创建 create database db_1 character set utf8;//避免重复创建数据库报错可以用一下命令 create database if not exists db_1 character set utf8;R(Retrieve):查询 //查询所…

PostMan测试文件上传

后端代码 package com.example.backend.controller;import cn.hutool.core.io.FileUtil; import cn.hutool.core.util.StrUtil; import com.example.backend.common.Result; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import org…

19. UE5 RPG使用GameplayEffect的Attribute Based Modifiers

前几篇文章我也说了GE的基础使用&#xff0c;但是&#xff0c;对一些属性的应用没有述说&#xff0c;后续&#xff0c;我将一点一点的将它们如何使用书写下来。 这一篇&#xff0c;主要就讲解一下Attribute Based Modifiers使用&#xff0c;先说一下它的应用场景&#xff0c;一…

使用Laravel安装器创建项目

使用Laravel安装器创建项目&#xff0c;使用Laravel安装器创建前先确保你的机器上已经下载了Laravel安装程序&#xff0c;可以通过终端界面查询是否下载了Laravel安装器&#xff0c;在终端中输入Laravel 查询&#xff0c;如下图所示则已下载Laravel安装程序&#xff0c;&#x…

macOS系统中通过brew安装MongoDB

Macos 修改目录权限&#xff1a; sudo chmod -R 777 你的文件夹 本文使用homebrew进行安装简单&#xff0c;因为从官网下载安装包并手动安装需要移动安装包到合适的目录下并配置环境变量等一大堆操作后才能使用数据库&#xff08;若没有安装过brew请自行百度进行安装brew&am…

基于粒子群算法的分布式电源配电网重构优化matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1基本PSO算法原理 4.2配电网重构的目标函数 5.完整工程文件 1.课题概述 基于粒子群算法的分布式电源配电网重构优化。通过Matlab仿真&#xff0c;对比优化前后 1.节点的电压值 2.线路的损耗,这里计…

十四、自回归(AutoRegressive)和自编码(AutoEncoding)语言模型

参考自回归语言模型&#xff08;AR&#xff09;和自编码语言模型&#xff08;AE&#xff09; 1 自回归语言模型&#xff08; AR&#xff09; 自回归语言模型&#xff08;AR&#xff09;就是根据上文内容&#xff08;或下文内容&#xff09;预测下一个&#xff08;或前一个&…

计算机网络(7)----应用层

目录 一.应用层的基本概念 1.应用层的基本概述 2.网络应用模型 &#xff08;1&#xff09;客户/服务器模型 &#xff08;2&#xff09;P2P模型 二.应用程序相关 1.DNS系统 &#xff08;1&#xff09;域名与域名服务器 &#xff08;2&#xff09;域名解析过程&#xff…

基于Java的无代码动态表单系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 动态类型模块2.2 动态文件模块2.3 动态字段模块2.4 动态值模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 动态类型表3.2.2 动态文件表3.2.3 动态字段表3.2.4 动态值表 四、系统展示五、核心代码5.1 查询档案类型5.…

农发行鱼台县支行组织开展3.15金融消费者权益保护教育宣传活动

为切实提升消费者金融素养及风险防范意识,3月15日农发行鱼台县支行组织开展以“金融消保在身边 保障权益防风险”为主题的“3.15”金融消费者权益保护教育宣传活动。 本次活动,该行重点围绕普及消费者八项基本权利、宣传金融纠纷多元化解机制、强化“三适当“原则、夯实诚信文…

sparksession对象简介

什么是sparksession对象 spark2.0之后&#xff0c;sparksession对象是spark编码的统一入口对象&#xff0c;通常我们在rdd编程时&#xff0c;需要SparkContext对象作为RDD编程入口&#xff0c;但sparksession对象既可以作为RDD编程对象入口&#xff0c;在sparkcore编程中可以通…

【LeetCode热题100】146. LRU 缓存(链表)

一.题目要求 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c…

RISC-V 编译环境搭建:riscv-gnu-toolchain 和 riscv-tools

RISC-V 编译环境搭建&#xff1a;riscv-gnu-toolchain 和 riscv-tools 编译环境搭建以及说明 操作系统&#xff1a;什么系统都可以 虚拟机&#xff1a;VMmare Workstation Pro 17.50.x (版本不限) 编译环境&#xff1a;Ubuntu 18.04.5 CPU&#xff1a;i7-8750h(虚拟机分配4核…