90分掌握一门语言:lua脚本基础到高级教程
mhr18 2024-11-05 10:25 23 浏览 0 评论
Lua,它的中文读音非常简单,就是把它的名称当汉语拼音去读,所以我们一般称他为"噜呃"("呃"小点声,最好是轻声),怎么说呢,这门编程语言是一个脚本语言,脚本语言向来都非常简单,Shell、Python都是如此,Lua也不例外。Lua虽然不像Java、Go、C等编程语言那么热门,但是也是在实际开发中比较灵活常用的工具语言之一,比如在在分布式锁中,经常会在redis中嵌入lua脚本,下面从Lua的基本介绍开始,快速的学会这门简单高效的编程语言。
- 1. Lua的基本概念和历史背景
- 2. Lua语言的特点和优势
- 2.1 简洁易学
- 2.2 轻量级高效
- 2.3 可扩展性强
- 2.4 安全性高
- 3. Lua的基本语法和常用数据结构
- 3.1 基本语法体验
- 3.2 常用数据结构
1. Lua的基本概念和历史背景
Lua是一种动态类型、解释型、轻量级的编程语言,旨在嵌入到其他应用程序中,为其提供脚本化能力,自从1993年由巴西的Roberto Ierusalimschy、Waldemar Celes和Luiz Henrique de Figueiredo共同设计以来,已经走过了数十年的发展历程。Lua的名称来源于葡萄牙语,意为“月亮”,寓意其小巧、灵活的特性。Lua最初的设计目标是为了解决嵌入式编程中遇到的复杂性和扩展性问题,随着其不断发展,现已广泛应用于游戏开发、Web应用、网络编程等领域。
2. Lua语言的特点和优势
2.1 简洁易学
Lua的语法简洁明了,易于上手。其语法结构类似于C语言,但更加精简,适合快速编写小型脚本。Lua还提供了丰富的库函数和扩展机制,方便开发者快速构建功能强大的应用程序。
2.2 轻量级高效
Lua的运行环境非常轻量,占用资源少,启动速度快。同时,Lua的执行效率也非常高,能够处理大量数据。这使得Lua在嵌入式系统和移动设备上具有广泛的应用前景。
2.3 可扩展性强
Lua提供了C API接口,允许开发者使用C语言编写自定义函数和库,扩展Lua的功能。这使得Lua能够与其他编程语言无缝集成,满足各种复杂的应用需求。
2.4 安全性高
Lua采用沙盒机制,限制了对宿主程序的访问权限,从而保证了脚本执行的安全性。此外,Lua还提供了错误处理机制,能够捕获并处理脚本执行过程中出现的异常和错误。
3. Lua的基本语法和常用数据结构
3.1 基本语法体验
Lua的基本语法包括变量声明、条件语句、循环语句、函数定义等。下面是一个简单的Lua示例代码:
-- 声明变量
local x = 10
local y = 20
-- 条件语句
if x > y then
print("x is greater than y")
elseif x < y then
print("x is less than y")
else
print("x is equal to y")
end
-- 循环语句
for i = 1, 5 do
print(i)
end
-- 函数定义
function add(a, b)
return a + b
end
print(add(x, y))
3.1.1 变量和数据类型
在Lua中,变量不需要预先声明,只需要为变量赋值即可。Lua是动态类型语言,变量不需要类型定义,只需要为变量赋值即可。Lua中的变量类型包括:
- nil:表示一个无效值,在条件表达式中相当于false。
- boolean:包含两个值:false和true。
- number:表示双精度类型的实浮点数。
- string:字符串由一对双引号或单引号来表示。
- table:Lua中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。
- function:由C或Lua编写的函数。
- userdata:表示任意存储在变量中的C数据结构。
- thread:表示执行的独立线路,用于执行协同程序。
3.1.2 运算符及其用法
Lua中的运算符包括:
- 算术运算符:+,-,*,/,%,^(求幂)。
- 关系运算符:==,~=(不等于),<,>,<=,>=。
- 逻辑运算符:and,or,not。
- 其他运算符:…(用于函数参数可变数量的表示),#(用于获取字符串或表数据的长度)。
3.1.3 条件控制语句
Lua中的条件控制语句包括:
- if语句:用于表示条件判断。if条件为true时,执行if语句中的代码块。if条件为false时,如果有else部分,执行else部分代码块,否则跳过if语句后面的代码块。
示例:
a=10
if(a<20)then
print("a 小于 20")
else
print("a 大于 20")
end
- if…elseif…else语句:用于在if条件为false时执行elseif…else语句代码块,用于检测多个条件语句。
示例:
a=100
if(a<20)then
print("a 小于 20")
elseif(a>20)then
print("a 大于 20")
else
print("a 等于 20")
end
3.1.4 循环控制语句
Lua中的循环控制语句包括:
- while循环:在判断条件为true时会重复执行循环体语句。
示例:
a=10
while(a<20)do
print("a 的值为:",a)
a=a+1
end
- for循环:可以重复执行指定语句,重复次数可在for语句中控制。数值for循环通过exp1、exp2、exp3控制循环次数,泛型for循环通过ipairs或pairs遍历表。
示例:
for i=1,10 do
print(i)
end
3.1.5 函数定义与调用
在Lua中,函数可以用作数据赋值,也可以作为参数传递。函数可以返回多个值。
示例:
function add(x,y)
return x+y
end
print(add(1,2)) -- 输出:3
在 Lua 中,函数的定义和调用是非常灵活和强大的。除了基本的函数定义和调用,Lua 还支持一些特殊的函数语法,如匿名函数、可变参数函数等。
3.1.6 基本函数定义与调用
基本函数定义使用 function 关键字,后面跟着函数名和参数列表,然后是函数体。
function myFunction(arg1, arg2)
-- 函数体
return arg1 + arg2
end
local result = myFunction(3, 4) -- 调用函数,将返回值赋值给变量 result
3.1.7 匿名函数(Lambda 函数)
匿名函数没有名字,可以直接赋值给变量。匿名函数通常用于高阶函数和回调函数中。
local function1 = function(x, y)
return x + y
end
-- 或者使用匿名函数简写形式
local function2 = function(a, b) return a + b end
local anonymousFunction = function(x, y) return x * y end
local result = anonymousFunction(5, 6) -- 调用匿名函数
3.1.8 闭包(Closure)
闭包是指函数及其相关引用环境的组合。闭包可以在函数之外访问和修改函数的局部变量。
function makeMultiplier(n)
return function(m)
return n * m
end
end
local double = makeMultiplier(2) -- 创建一个新的函数,用于将输入乘以2
local product = double(3) -- 调用新函数,将3乘以2
3.1.9 可变参数函数
Lua 中的函数可以接受可变数量的参数。可以通过 ... 来获取所有额外的参数,它们会作为一个表返回。
function sum(numbers, ...)
local sum = 0
for i, v in ipairs(numbers) do
sum = sum + v
end
for i, v in ipairs({...}) do
sum = sum + v
end
return sum
end
local result = sum(1, 2, 3, 4, 5) -- 调用函数,计算 1 到 5 的和
3.1.10 局部函数和嵌套函数
在函数内部定义的函数称为局部函数。局部函数可以访问外部函数的变量,但不能访问外部函数的外部变量。
function outerFunction()
local x = 10
function innerFunction()
print(x)
end
innerFunction() -- 调用内部函数,输出 10
end
outerFunction()
3.1.11 递归函数
递归函数是调用自身的函数。递归函数常用于解决需要重复执行的问题,如阶乘、斐波那契数列等。
function factorial(n)
if n == 0 then
return 1
else
return n * factorial(n - 1)
end
end
local result = factorial(5) -- 调用函数,计算 5 的阶乘
3.1.13 Lua函数返回值的基本语法
在Lua中,函数返回值的基本语法是在函数体中使用return关键字来指定返回值。返回值可以是单个值,也可以是多个值。
Lua函数返回单个值的语法和示例
如果函数只需要返回一个值,可以直接在return语句后指定该值。例如:
function add(a, b)
return a + b
end
result = add(3, 4) -- result = 7
Lua函数返回多个值的语法
如果函数需要返回多个值,可以在return语句后列出所有要返回的值,用逗号分隔。例如:
function maximum(a)
local mi = 1
local m = a[mi]
for i, v in ipairs(a) do
if v > m then
mi = i
m = v
end
end
return m, mi
end
max_value, max_index = maximum({8, 10, 23, 12, 5}) -- max_value = 23, max_index = 3
Lua函数无返回值时的情况
如果函数没有return语句,或者return语句后面没有值,那么函数将默认返回nil。例如:
function no_return()
-- 没有return语句
end
result = no_return() -- result = nil
关于Lua函数返回值语法的注意事项和常见问题
- Lua函数可以返回任意数量的值,但调用函数时,必须确保接收的变量数量与函数返回值的数量匹配。
- 如果函数返回值的数量多于接收的变量数量,超出部分将被丢弃。
- 如果函数返回值的数量少于接收的变量数量,多余的变量将自动被赋值为nil。
- 当函数被当作一个语句调用时(如add(3, 4)),所有返回值都将被丢弃。
- 在Lua中,函数调用总是带括号,除非单个参数的函数且参数是字符串或表构造器。
- 调用函数时,如果函数只返回一个值,并且该值被用作表达式的一部分(如print(add(3, 4))),那么函数返回的第二个及之后的值将不会被赋值或输出。
以上内容全面涵盖了Lua函数返回值的基本语法、单个返回值的语法、多个返回值的语法,以及无返回值的情况,以及注意事项和常见问题。
3.1.14 Lua中其他语法的使用
Lua中ipairs函数的使用方法和示例
ipairs是一个迭代器函数,它返回一个用于遍历table(表)的迭代器。它只适用于key为整数的table,并且从1开始递增。当遍历到第一个非整数的key或者遍历到nil值时,迭代结束。
local t = {1, 2, 3, "a", 4, nil}
for i, v in ipairs(t) do
print(i, v)
end
Lua中pairs函数的使用方法和示例
pairs函数也是一个迭代器函数,用于遍历table中的所有key-value对。无论key是整数还是字符串,都可以遍历到。当遍历到nil值时,迭代结束。
local t = {1, 2, 3, "a", 4, nil}
for k, v in pairs(t) do
print(k, v)
end
Lua中可变参数列表的语法和用法
在Lua中,可以使用...表示不定数量的参数,这就是可变参数列表。它常用于函数调用,也可以用于函数定义中。
function sum(...)
local s = 0
for i, v in ipairs{...} do
s = s + v
end
return s
end
print(sum(1, 2, 3, 4, 5)) -- 输出 15
Lua中的not逻辑操作符的作用和用法
not是一个逻辑操作符,用于对布尔值进行取反操作。如果布尔值为true,则not操作符返回false;如果布尔值为false,则not操作符返回true。
print(not true) -- 输出 false
print(not false) -- 输出 true
Lua中的#长度操作符的功能和使用场景
#是Lua中的长度操作符,用于获取table的长度。如果table是一个数组,那么它的长度就是数组中元素的个数;如果table是一个map,那么它的长度就是map中key的数量。
local t = {"a", "b", "c"}
print(#t) -- 输出 3
local m = {x = 1, y = 2, z = 3}
print(#m) -- 输出 3
Lua中的三目表达式的语法结构和用法
三目表达式是Lua中的条件表达式,它的语法结构是条件 ? 值1 : 值2。如果条件为真,则返回值1;如果条件为假,则返回值2。
local a = 10
local b = 20
local max = (a > b) and a or b
print(max) -- 输出 20
3.2 常用数据结构
Lua支持多种常用数据结构,包括数字、字符串、表(类似于数组和字典的结合体)、函数等。表是Lua中最重要的数据结构之一,它可以存储任意类型和数量的数据,并支持复杂的操作:
- 表(Tables):表是Lua中最基本的数据结构,类似于数组和字典的结合体。在表中,每个元素都由一个键值对(key-value pair)表示,键可以是数字或字符串,值可以是任何类型的数据,包括其他表。表在Lua中非常灵活,可以用来表示数组、字典、集合等多种数据结构。
用法:
-- 创建一个空表
local table1 = {}
-- 创建一个包含键值对的表
local table2 = {
key1 = "value1",
key2 = 123,
key3 = true
}
-- 访问表中的元素
print(table2.key1) -- 输出 "value1"
-- 修改表中的元素
table2.key1 = "new value"
print(table2.key1) -- 输出 "new value"
-- 添加新的键值对
table2["key4"] = "value4"
print(table2.key4) -- 输出 "value4"
-- 遍历表中的元素
for key, value in pairs(table2) do
print(key, value)
end
- 字符串(Strings):字符串是Lua中的另一种基本数据类型,用于表示文本信息。Lua支持多种字符串操作函数,如连接、截取、替换等,使得字符串处理变得简单方便。
用法:
-- 创建一个字符串
local str = "Hello, World!"
-- 访问字符串中的字符
print(string.sub(str, 1, 5)) -- 输出 "Hello"
-- 连接字符串
local str1 = "Hello, "
local str2 = "World!"
local str3 = str1 .. str2
print(str3) -- 输出 "Hello, World!"
-- 替换字符串中的子串
local newStr = string.gsub(str, "World", "Lua")
print(newStr) -- 输出 "Hello, Lua!"
- 数字(Numbers):Lua支持两种类型的数字:整数(Integer)和浮点数(Float)。Lua的数字类型没有显式的声明,它们可以自动转换。
用法:
-- 创建一个整数
local num1 = 123
-- 创建一个浮点数
local num2 = 3.14
-- 进行数学运算
local result = num1 + num2
print(result) -- 输出 126.1
相关推荐
- Docker安装详细步骤及相关环境安装配置
-
最近自己在虚拟机上搭建一个docker,将项目运行在虚拟机中。需要提前准备的工具,FinallShell(远程链接工具),VM(虚拟机-配置网络)、CentOS7(Linux操作系统-在虚拟机上安装)...
- Linux下安装常用软件都有哪些?做了一个汇总列表,你看还缺啥?
-
1.安装列表MySQL5.7.11Java1.8ApacheMaven3.6+tomcat8.5gitRedisNginxpythondocker2.安装mysql1.拷贝mysql安装文件到...
- Nginx安装和使用指南详细讲解(nginx1.20安装)
-
Nginx安装和使用指南安装1.检查并安装所需的依赖软件1).gcc:nginx编译依赖gcc环境安装命令:yuminstallgcc-c++2).pcre:(PerlCompatibleRe...
- docker之安装部署Harbor(docker安装hacs)
-
在现代软件开发和部署环境中,Harbor作为一个企业级的容器镜像仓库,提供了高效、安全的镜像管理解决方案。通过Docker部署Harbor,可以轻松构建私有镜像仓库,满足企业对镜像存储、管理和安全性...
- 成功安装 Magento2.4.3最新版教程「技术干货」
-
外贸独立站设计公司xingbell.com经过多次的反复实验,最新版的magento2.4.3在oneinstack的环境下的详细安装教程如下:一.vps系统:LinuxCentOS7.7.19...
- 【Linux】——从0到1的学习,让你熟练掌握,带你玩转Linu
-
学习Linux并掌握Java环境配置及SpringBoot项目部署是一个系统化的过程,以下是从零开始的详细指南,帮助你逐步掌握这些技能。一、Linux基础入门1.安装Linux系统选择发行版:推荐...
- cent6.5安装gitlab-ce最新版本-11.8.2并配置邮件服务
-
cent6.5安装gitlab-ce最新版本-11.8.2并配置邮件服务(yum选择的,时间不同,版本不同)如果对运维课程感兴趣,可以在b站上搜索我的账号:运维实战课程,可以关注我,学习更多免费的运...
- 时隔三月,参加2020秋招散招,终拿字节跳动后端开发意向书.
-
3个月前头条正式批笔试4道编程题只AC了2道,然后被刷了做了200多道还是太菜了,本来对字节不抱太大希望,毕竟后台竞争太大,而且字节招客户端开发比较多。后来看到有散招免笔试,抱着试一试的心态投了,然而...
- Redisson:Java程序员手中的“魔法锁”
-
Redisson:Java程序员手中的“魔法锁”在这个万物互联的时代,分布式系统已经成为主流。然而,随着系统的扩展,共享资源的争夺成为了一个棘手的问题。就比如你想在淘宝“秒杀”一款商品,却发现抢的人太...
- 【线上故障复盘】RPC 线程池被打满,1024个线程居然不够用?
-
1.故障背景昨天晚上,我刚到家里打开公司群,就看见群里有人讨论:线上环境出现大量RPC请求报错,异常原因:被线程池拒绝。虽然异常量很大,但是异常服务非核心服务,属于系统旁路,服务于数据核对任务,即使...
- 小红书取消大小周,有人不高兴了!
-
小红书宣布五一节假日之后,取消大小周,恢复为正常的双休,乍一看工作时长变少,按道理来说大家应该都会很开心,毕竟上班时间缩短了,但是还是有一些小红书的朋友高兴不起来,心情很复杂。因为没有了大小周,以前...
- 延迟任务的多种实现方案(延迟机制)
-
场景订单超时自动取消:延迟任务典型的使用场景是订单超时自动取消。功能精确的时间控制:延时任务的时间控制要尽量准确。可靠性:延时任务的处理要是可靠的,确保所有任务最终都能被执行。这通常要求延时任务的方案...
- 百度java面试真题(java面试题下载)
-
1、SpingBoot也有定时任务?是什么注解?在SpringBoot中使用定时任务主要有两种不同的方式,一个就是使用Spring中的@Scheduled注解,另一个则是使用第三方框架Q...
- 回归基础:访问 Kubernetes Pod(concurrent.futures访问数据库)
-
Kubernetes是一头巨大的野兽。在它开始有用之前,您需要了解许多概念。在这里,学习几种访问集群外pod的方法。Kubernetes是一头巨大的野兽。在它开始有用之前,您需要了解许多不同的...
- Spring 缓存神器 @Cacheable:3 分钟学会优化高频数据访问
-
在互联网应用中,高频数据查询(如商品详情、用户信息)往往成为性能瓶颈。每次请求都触发数据库查询,不仅增加服务器压力,还会导致响应延迟。Spring框架提供的@Cacheable注解,就像给方法加了一...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- Docker安装详细步骤及相关环境安装配置
- Linux下安装常用软件都有哪些?做了一个汇总列表,你看还缺啥?
- Nginx安装和使用指南详细讲解(nginx1.20安装)
- docker之安装部署Harbor(docker安装hacs)
- 成功安装 Magento2.4.3最新版教程「技术干货」
- 【Linux】——从0到1的学习,让你熟练掌握,带你玩转Linu
- cent6.5安装gitlab-ce最新版本-11.8.2并配置邮件服务
- 时隔三月,参加2020秋招散招,终拿字节跳动后端开发意向书.
- Redisson:Java程序员手中的“魔法锁”
- 【线上故障复盘】RPC 线程池被打满,1024个线程居然不够用?
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)