ToB企服应用市场:ToB评测及商务社交产业平台
标题:
lua~基本语法
[打印本页]
作者:
小小小幸运
时间:
2024-5-19 19:31
标题:
lua~基本语法
学习 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 + b
end
-- 传递多个参数
function dd(...)
local args = {...}
for i, v in ipairs(args) do
print("参数", 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 then
print("name length = ".. #name)
elseif #name >5 then
print("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 then
error("除数不能为0")
end
return a / b
end
local status, result = pcall(divide, 10, 0)
if status then
print("结果:", result)
else
print("发生错误:", 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 = name
obj.age = age
function obj:sayName()
print("My name is " .. self.name)
end
return obj
end
function Person.old(self, name, age)
self.name = name
self.age = age
function 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参数。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4