lua~基本语法

news/2024/9/28 23:31:55

学习 Lua 的必要性

  • nginx开发
  • apisix,kong插件开发

语言特点

  • 语句结束没有分号
  • 跟 JavaScript 很像
  • 默认定义的是全局变量,定义局部变量需要加 local 关键字
  • 数组索引从1开始
  • 没有 i++ 操作符号,只能 i = i + 1

注释

  • 单行注释
    -- 注释内容
  • 多行注释
    --[[注释内容]]--

内置数据类型

总共有6种内置数据类型, 其中包括nil, boolean, number, string, table, function

nil

通常是没有赋值,直接使用才会是这个值, 比如说下面的代码直接打印变量name lua print(name), 在 ifelse 判断语句中,nil 被当成false 分支,但 nil ~= false, 在 Lua 语言当中,不等于使用 ~= 来表示, 而不是我们常见的 != 。

boolean

有两种取值:true, false

number

所有的数值类型都使用 number 来表示,不管是整数,还是浮点数,其实内部的存储方式是双精度类型。

string

字符串可以用双引号,也可以用单引号包围起来,特殊字符需要转义

name = "dev4mobile"
name = 'dev4mobile'
nameWithAge = 'dev4mobile \n 25'
# 多行字符串
welcome = [[hello world]]

table

其实就是其它语言里面的对象, 有两种表现方式,一种是数组,一种是字典(Map),都是使用大括号括起来的。记住数组索引从1开始。

arr = { 1, "dev4mobile", 'cn.dev4mobile@gamil.com', 12.3, function()endv}
person = { name = 'dev4mobile' }

function

定义如下,以 function关键字作为开头,add 是函数名字

 -- 一般定义function add(a, b)return a + bend-- 传递多个参数
function dd(...)local args = {...}for i, v in ipairs(args) doprint("参数", i, ":", v)end
end-- 返回多个参数
function res()return "abc", 12, function() end
end
local value1, value2, value3 = res()

控制流语句

循环

循环有3种写法,for, while,repeat .. until

说明: #变量名 表示读取变量的长度,可以是字符串和数组

-- for 循环
arr = { 1, 2, 3, 4, 5 }
for i=1, #arr do -- 索引从1开始print(arr[i])
end-- while 循环
arr = { 1, 2, 3, 4, 5 }
i = 1
while i <= #arr do
print(arr[i])
i = i + 1
end-- repeate until 循环
arr = { 1, 2, 3, 4, 5 }
i = 1
repeat
print(arr[i])
i = i + 1
until i >= #arr

分支 ( ifelse )

name = "dev4mobile"
if #name > 10 thenprint("name length = ".. #name)
elseif #name >5 thenprint("name length > 5, real length = "..#name) -- 两个点..代表字符串
else print("name length < "..#name)
end

面向对象

实现原理:有点类似 JavaScript 的实现使用原型方式,使用函数 + table 实现。

模块

在写demo之前有必要先介绍下模块的概念,一般来说一个文件就是一个模块,跟 JavaScript 一样, 导入模块关键字 require, 导出模块关键字return

下面我们来新建一个模块名,首先新建一个文件名: perosn.lua,输入下面代码

-- 定义模块
-- 解释器
#!/usr/local/bin/lua
local Person = {}
-- 导出模块名,类似JavaScript中的export
return Person -- 导入模块
-- 解释器
#!/usr/local/bin/lua
local perosn = require('person')

构造对象

首先新建一个文件名: perosn.lua,输入下面代码

-- 定义模块
-- 解释器
#!/usr/local/bin/lua
local Person = {}
-- 定义构造函数
function Person:new(name, age)-- __index 指向 父类 table-- setmetatable 关联了 新创建的对象 { name = name, age = age } 与 Person 对象return setmetatable({ name = name, age = age }, { __index = Person })end
function Person:toString() print('name='..self.name..', age='..self.age)
end-- 导出模块名,类似JavaScript中的export
return Person -- 导入模块
-- 解释器
#!/usr/local/bin/lua
local Perosn = require('person')-- 调用构造函数
local person = Person:new("dev4mobile", 21)-- 调用对象的toString方法, 这个方法是父类方法,需要我们setmetatable来绑定,也就是我们定义对象时 setmetatable({ name = name, age = age }, { __index = Person }) 来绑定的
person.toString()

异常处理

在Lua中是支持异常处理的。Lua提供了pcall函数来捕获函数执行过程中可能抛出的错误。下面是一个简单的示例:

function divide(a, b)if b == 0 thenerror("除数不能为0")endreturn a / b
endlocal status, result = pcall(divide, 10, 0)if status thenprint("结果:", result)
elseprint("发生错误:", result)
end

在上面的例子中,我们定义了一个divide函数用于进行除法运算,如果除数为0,则会通过error函数抛出一个错误。然后我们使用pcall来调用divide函数,如果函数执行成功,pcall返回true和函数的返回值;如果函数执行过程中有错误,pcall返回false和错误信息。通过判断pcall的返回值,我们可以进行相应的异常处理。

冒号(:)和点号(.)的区别

在Lua中,使用冒号(:)和点号(.)的区别在于函数定义时是否将self作为第一个参数传入。

  • 使用冒号(:)定义的方法会自动将调用该方法的对象作为第一个参数传入,通常约定将这个参数命名为self。这样,在方法内部就可以通过self来访问对象的成员变量和其他方法。
  • 使用点号(.)定义的方法则不会自动传入对象本身作为第一个参数,需要手动传入或者直接访问全局变量。

下面是代码示例:

local Person = {}function Person:new(name, age)local obj = {}obj.name = nameobj.age = agefunction obj:sayName()print("My name is " .. self.name)endreturn obj
endfunction Person.old(self, name, age)self.name = nameself.age = agefunction self.sayName()print("My name is " .. self.name)end
end-- 使用冒号调用new方法
local person1 = Person:new("Alice", 25)
person1:sayName()-- 使用点号调用old方法
local person2 = {}
Person.old(person2, "Bob", 30)
person2.sayName(person2)

在上面的例子中,Person:new方法使用冒号定义,自动传入了self参数;而Person.old方法使用点号定义,需要手动传入self参数。

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

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

相关文章

lua~IDEA中调试lua脚本

开发工具IDE工具:jetbrain IDEA 工具插件:EmmyLua本机lua项目和调试lua文件添加lua项目模板,安装完EmmyLua插件就有了添加模板项目后,在项目中添加lua类型的文件为lua项目添加一个编译调试器在调试器中,配置lua和lua项目的信息现在就可以输出hell world了MobDebug pkulche…

salesforce零基础学习(一百三十六)零碎知识点小总结(八)

本篇参考: Salesforce LWC学习(七) Navigation & Toast https://developer.salesforce.com/docs/platform/lwc/guide/use-navigate-url-addressable.html https://help.salesforce.com/s/articleView?id=release-notes.rn_lwc_UrlAddressable.htm&release=250&ty…

使用Consul服务注册和发现

2.1服务注册 2.1.1引入依赖<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency>2.1.2编写配置文件 server:port: 80 spring:application:name: clou…

在win10右下角显示时间秒

1、首先按组合键“win+r”打开运行窗口,在窗口中输入regedit,按回车键进入注册表编辑器或者按组合键“win+x”在PowerShell中执行命令regedit(效果相同)进入注册表编辑器之后依次找到:HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersio\Explorer\Advanced,新建D…

Consul安装

1.1 Win安装选择我们想要下载的版本点击下载,如果芯片是AMD选择右边下载。 解压下载的文件进入解压之后的文件查看是否成功安装consul agent -dev -dev表示开发模式运行,另外还有-server表示服务模式运行前端查看:1.2 CentOS安装 1.查看系统芯片架构: arch2.安装解压工具un…

图机器学习入门:基本概念介绍

图机器学习(Graph Machine Learning,简称Graph ML)是机器学习的一个分支,专注于利用图形结构的数据。在图形结构中,数据以图的形式表示,其中的节点(或顶点)表示实体,边(或链接)表示实体之间的关系。 本篇文章将从基础开始介绍什么是图,我们如何描述和表示它们,以及…

得物 ZooKeeper SLA 也可以 99.99%

在本文中,作者探讨了ZooKeeper(ZK)的一个内存占用问题,特别是当有大量的Watcher和ZNode时,导致的内存消耗。1. 背景 ZooKeeper(ZK)是一个诞生于 2007 年的分布式应用程序协调服务。尽管出于一些特殊的历史原因,许多业务场景仍然不得不依赖它。比如,Kafka、任务调度等。…

祝贺!触想获评第二十一届“深圳知名品牌”

5月9日,第八届“深圳(湾区)国际品牌周”活动盛大开幕,会上公布并表彰了一批具有高创新力和竞争力的品牌名单。作为工控物联领域优秀品牌代表,触想智能与各级政府领导、国内外品牌界权威专家、知名企业领袖和企业代表同台共庆,并收获“深圳知名品牌”、“湾区知名品牌”两项…