lua完整学习笔记

简介: Lua学习笔记,涵盖了Lua的注释、数据结构、标识符、保留字、变量、运算符、函数、流程控制语句、循环语句、table的使用、迭代器以及模块化等基础知识点。

lua注释

-- 单行注释
--[[ 多行注释 ]]--

lua数据结构

nil 无效值与Java的Null类似,但是在条件表示中是false

boolean 布尔值,ture或者false

number 双精度类型的浮点数

string 字符串 " " , ' ' , [[ ]]

table 类似于java数组,但是比数组更强大

function 由c或者lua编写的函数

thread 协同线程,是协同函数的执行体,即正在执行的协同函数

userdata 一种用户自定义数据,用于表示一种由应用程序或c/c++ 语言库所创建的类型,可以将c和c++的任意数据类型的数据存储到lua变量中调用。

lua标识符

由字母、数字、下划线组成,但不能以数字开头。

lua保留字

and break do else elseif end false for function if in local nil not or repeat return then true until while goto

除此之外lua还定义很多内置全局变量,以下划线后跟全大写字母

lua变量

lua是弱类型语言,无需声明即可拿来用

str="你好"

变量分为全局变量和局部变量,lua中默认的就是全局变量,而局部变量local,只能在声明的语句块中使用。

local x=3

function f(){
  y=5;
  local z=8
  print("x = " ..x);
}
end

f();
-- 访问全局变量y, .. 类似于java里面的+
print("y=" ..y);
print("z=" ..z);

结果是:

x=3

y=5

z报错。

动态类型:lua是动态类型语言,变量的类型可以随时改变,无需再声明。

lua运算符

a=10 b=20

  • a+b 30 加法

- a-b 10 减法

* a*b 200 乘法

/ 5/2 2.5 除法

% b%a 0 取余

^ a^2 100 求幂

~ -a -10 负数

// 5//2 2 整除 整除运算符(>=lua5.3)

关系运算符:

==(等于) 、 ~=(不等于)、 > (大于)、< (小于) 、>= (大于等于) 、<= (小于等于)

逻辑运算符:

and 逻辑与、or 逻辑或 、 not 逻辑非。

其他运算符:

lua语言中的连接运算符与计算表或字符串长度的运算符;

.. 字符串连接符。 a..b,其中a为"Hello" ,b为"World",输出结果为"Hello World"

返回字符串或表的长度。 #"Hello" 返回5

lua函数

lua中的函数的定义是以function开头,后跟函数名与参数列表,以end结尾。其可以没有返回值,也可以一次返回多个值。

固定参函数

function f(a,b)

 print(a,b)


end

print("无实参传递")
f()
print("传递一个实参")
f(10)
print("传递两个实参")
f(10,20)
print("传递三个实参")
f(10,20,30)

结果:

nil nil

10 nil

10 20

10 20

可变参函数

-- 定义一个普通函数,包含可变参
function f(...)
 local a,b,c,d=...
 print(a,b,c,d)


end

可返回多个值

-- 定义一个普通函数,返回两个值
function f(a,b)
 local sum=a+b
 local mul=a*b
 return sum,mul;

end

-- 一次接受两个值
m,n=f(3,5)
print(m,n)

函数作为参数

lua的函数中,允许函数作为参数,作为参数的函数,可以是已经定义好的普通函数,也可以是匿名函数。

-- 定义两个普通函数
function sum(a,b)
   return a+b
end

function mul(a,b)

   return a*b

end

-- 定义一个函数,其参数是函数
function f(m,n,fun)

  local result=fun(m,n)
  print(result)
end

-- 普通调用
f(3,5,sum);
f(3,5,mul);

-- 匿名函数调用
f(3,5,function (a,b) 
       return a-b;
    end

)

lua 流程控制语句

if语句

lua提供了if...then用于表示条件判断,其中if的判断条件可以是任意表达式。lua系统将false与nil作为假,将true与非nil作为真,即使是0也是真。

if嵌套语句

lua中提供了专门的关键字elseif来做if嵌套语句。注意,不能使用else与if两个关键字的联用形式,即不能使用else if来嵌套if语句

a=5
if(a>0) then
    print("num>0")
else
    print("num<0")
end
a=5
if(a>0) then
    print("num>0")
elseif num==0 then
    print("num=0")
else
    print("num<0")
end

lua 循环语句

lua提供了四种循环控制语句:while...do循环,repeat....until循环、数值for循环,以及泛型for循环。同时,lua还提供了break与goto两种循环流程控制语句。

a=3
while a>0 do
  print(a)
  a=a-1
end
repeat
   print(a)
   a=a-1
until a<=0
for i=10,50,20  do

      print(i)
end

-- 结果:
--[[ 10
     30
     50
--]]

-- 意为i=10, i<=50,i=i+20
-- 20不写的话,默认是1
for i=1,9 do
   print(i)
   if i==5 then
      break
   end
end

lua 的table

数组

使用table可以定义一维、二维、多维数组。不过,需要注意,lua中的数组索引是从1开始的,且无需声明数组长度,可以随时增加元素。当然,同一数组元素可以是任意类型。

-- 定义一个一维数组
cities={"北京","上海","广州"}
cities[4]="深圳"
for i=1 4 do
   print("cities["..i.."]="..cities[i])

end

--开始搞二维数组
-- 声明一个空的数组
arr={}
for i=1, 3 do
-- 声明一个空的数组
   arr[i]={}
   for j=1, 2 do
     arr[i][j]=i*j
   end
end

for i=1,  3 do
  for j=1,2 do
    print(arr[i][j])
  end
end

map

使用table也可以定义出类似map的key-value数据结构。其可以定义table时直接指定key-value,也可以单独定义key-value。而访问时,一般都是通过table的key直接访问,也可以数组索引方式来访问,此时的key为索引。

-- 定义一个map
emp={name="张三",age=23,depart="销售部"}

-- 通过下标方式
emp["gender"]="男"

print(emp["name"])
print(emp["gender"])

-- 点号方式操作
print(emp.age)


-- map  key为表达式
a="xxx"
b=3
c=5

arr={
  ["emp_"..a]=true,
  [b+c]="Hello"
}

lua允许将数组与key-value混合在同一个table中进行定义。key-value不会占用数组的数字索引值。

-- 定义一个数组、map混合结构
emps={
  {name="张三",age=23},
  {name="李四",age=24},
 {name="王五",age=25},
 {name="赵六",age=26}
}
for i=1 ,4 do
  print(emps[i].name..":" ..emps[i].age)
end

官网:Lua 5.4 Reference Manual - contents

emp={"北京",name="张三",age=23,"上海",depart="销售部","广州","深圳"}
print(table.concat(emp))

结果:北京上海广州深圳

emp={"北京",name="张三",age=23,"上海",depart="销售部","广州","深圳"}
print(table.concat(emp,",",2))

结果:上海,广州,深圳

emp={"北京",name="张三",age=23,"上海",depart="销售部","广州","深圳"}
print(table.concat(emp,",",2,4))

结果:上海,广州

table.unpack()

table.pack()打包成一个table
t=table.pack("apple","banana","peach")

数组如果包含nil就会报错

lua迭代器

ipairs(table): 仅会迭代指定table中的数组元素

pairs(table): 会迭代整个table元素,无论是数组元素,还是key-value。

--遍历emp中的所有数组元素
for i,v in ipairs(emp) do
    print(i,v)
end
for k,v in pairs(emp) do
    print(k,v)
end

lua模块

--声明一个模块
rectangle ={}

--为模块添加一个变量
rectangle.pi=3.14

--为模块添加函数(求周长)
function rectangle.perimeter(a,b)
     return (a+b)*2
end
--以匿名函数方式为模块添加一个函数(求面积)
rectangle.area=function(a,b)
     return a*b;
end

return rectangle

使用模块

require "rectangle"
print(rectangle.pi)
print(rectangle.perimeter(3,5))
print(rectangle.area(3,5))
目录
相关文章
|
消息中间件 数据采集 域名解析
数据采集-Lua集成kafka流程跑通|学习笔记
快速学习数据采集-Lua集成kafka流程跑通
498 0
数据采集-Lua集成kafka流程跑通|学习笔记
|
数据采集 前端开发 大数据
Lua 获取 Get 与 Post 请求数据|学习笔记
快速学习 Lua 获取 Get 与 Post 请求数据
Lua 获取 Get 与 Post 请求数据|学习笔记
|
12月前
|
C++
[笔记]Lua脚本学习笔记《二》调用cpp动态库
[笔记]Lua脚本学习笔记《二》调用cpp动态库
|
12月前
|
SQL JSON 安全
[笔记]Lua脚本学习笔记《一》
[笔记]Lua脚本学习笔记《一》
|
Ubuntu 安全 物联网
Wifi-nodeMCU-esp8266 开发语言 Lua 介绍 | 学习笔记
快速学习 Wifi-nodeMCU-esp8266 开发语言 Lua 介绍
292 0
Wifi-nodeMCU-esp8266 开发语言 Lua 介绍 | 学习笔记
|
缓存 算法 前端开发
网站流量日志埋点收集—后端脚本(nginx+lua)|学习笔记
快速学习网站流量日志埋点收集—后端脚本(nginx+lua)
568 0
网站流量日志埋点收集—后端脚本(nginx+lua)|学习笔记
|
消息中间件 数据采集 Java
Lua集成kafka第三方插件代码介绍|学习笔记
快速学习Lua集成kafka第三方插件代码介绍
133 0
Lua集成kafka第三方插件代码介绍|学习笔记
|
数据采集 NoSQL Java
Lua 脚本读取 redis 数据|学习笔记
快速学习 Lua 脚本读取 redis 数据
Lua 脚本读取 redis 数据|学习笔记
|
数据采集 NoSQL 网络协议
Openresty 自带 redis.lua 介绍|学习笔记
快速学习 Openresty 自带 redis.lua 介绍
Openresty 自带 redis.lua 介绍|学习笔记
|
数据采集 大数据 应用服务中间件
Lua 获取 Header 与 Body 数据|学习笔记
快速学习 Lua 获取 Header 与 Body 数据
Lua 获取 Header 与 Body 数据|学习笔记