lua完整学习笔记
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完整学习笔记的更多相关文章
- lua本学习笔记功能
Lua本学习笔记功能 1. 函数返回 指定任务的主要功能是完成,在这种情况下,函数被用作调用语句.函数可以计算并返回值,在这种情况下,作为分配值表达式语句使用. 语法: funcationfunc_ ...
- SpringBoot 完整学习笔记免费分享
从0到进阶,完全系统性的学习笔记 每次我都会反复拿来观看,因为我们总会有遗漏忘记的地方,但是笔记不会. 希望大家能好好利用它,以下是笔记截图! 以上只是其中的一项部分,这份笔记可以说含金量超高,绝对会 ...
- GJM : Lua 语言学习笔记
Lua笔记 容易与C/C++整合 Lua所提供的机制是C所不善于的:高级语言,动态结构,简洁,易于测试和调试. Lua特有的特征: `1:可扩展性.卓越的扩展性导致了很多人将Lua用作搭建领域语言的工 ...
- Mybatis-Plus 实战完整学习笔记(一)------简介
第一章 简介 1. 什么是MybatisPlus MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只 ...
- LUA table学习笔记
function printT( ... ) for i,v in ipairs(...) do print(i,v) end end t1={} t2={} t3={} table.insert(t ...
- Lua JSONRPC学习笔记
JSON RPC JSON RPC 为利用json数据格式来执行远程调用方式, 作用同xmlrpc,不过与xmlrpc相比, jsonrpc更加轻量,json更加节省数据量,更加可读性高. 官网网站: ...
- Lua 基础 -- 学习笔记
标签(空格分隔): Lua 1. Lua可以一次性给多个变量赋值 变量比赋值多,多的变量就赋值nil 变量比赋值少,多的赋值舍弃 local a, b, c = 1, 2, 3 print( a, b ...
- Allure测试报告完整学习笔记
目录 简介 安装Allure Allure测试报告的结构 Java TestNG集成Allure Report Python Pytest集成Allure Report 简介 假如你想让测试报告变得漂 ...
- Mybatis-Plus 实战完整学习笔记(十一)------条件构造器删除,修改,conditon
1.修改功能--其他过滤方式跟select一样 /** * 修改条件构造器 * @throws SQLException */ @Test public void selectUpdate() thr ...
- Mybatis-Plus 实战完整学习笔记(十)------条件构造器核心用法大全(下)
31.升序orderByAsc 31.升序orderByAsc List<Employee> employeeList = employeeMapper.selectList(new Qu ...
随机推荐
- 1、Spring简介
1.1.概述 Spring 是轻量级的框架,其基础版本只有 2 MB 左右的大小. Spring 框架是一个开源的 Java 平台,它最初是由 Rod Johnson 编写的,并且于 2003 年 6 ...
- 2023-08-22:请用go语言编写。给定一个长度为N的正数数组,还有一个正数K, 返回有多少子序列的最大公约数为K。 结果可能很大,对1000000007取模。 1 <= N <= 10^5, 1
2023-08-22:请用go语言编写.给定一个长度为N的正数数组,还有一个正数K, 返回有多少子序列的最大公约数为K. 结果可能很大,对1000000007取模. 1 <= N <= 1 ...
- 手机用户的开源福音「GitHub 热点速览」
不知道多少用安卓机的小伙伴,被开屏广告烦过.相比有些克制的 iOS 机,安卓机是个应用基本上都有开屏广告,少则 3s 多则 10s,本周获得 1k+ star 的 Android-Touch-Help ...
- 2022最新 Navicat Premium 16中文软件激活安装永久使用正版(支持MAC+win)
Navicat Premium 16中文正版永久使用,下载地址: 关注我的wx公众号"奋斗在IT"回复1015获取下载地址
- 腾讯事务处理技术验证系统3TS-Coo模块的项目环境安装使用说明
本篇文章将详细说明3TS-Coo模板的安装和使用,帮助您快速上手项目 第一部分是简单的基础Docker相关概念,精炼的几句小白话快速理解即可: 第二部分是快速安装项目环境的安装文档,简单几行命令搞定, ...
- 支持JDK19虚拟线程的web框架,之三:观察运行中的虚拟线程
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本篇是<支持JDK19虚拟线程的web ...
- 斜率优化DP 学习笔记
斜率优化 DP 适用情况 适用于求解最优解(最大.最小)问题. 上凸壳与下凸壳 求解步骤 对于任意状态转义方程,设 \(A_i\),\(B_i\),使状态转移方程转化为 \(f_i = \min(f_ ...
- 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(4) -- 实现DataGrid数据的导入和导出操作
在我们设计软件的很多地方,都看到需要对表格数据进行导入和导出的操作,主要是方便客户进行快速的数据处理和分享的功能,本篇随笔介绍基于WPF实现DataGrid数据的导入和导出操作. 1.系统界面设计 在 ...
- DBConvertStudio使用记录
DBConvertStudio使用记录 前言 这篇文章是我在学习使用DBConvertStudio过程中的学习记录,以便日后遗忘查阅: 诸君也可跟随我的步伐了解一下DBConvertStudio 声明 ...
- 解密Prompt系列16. LLM对齐经验之数据越少越好?LTD & LIMA & AlpaGasus
LLM Agent中间插个队,总结下指令微调.对齐数据相关的方案,已经凑够7篇论文可以召唤神龙啦!论文都是以优化指令样本为核心,Data-Centric的观点比较一致:指令微调也就是对齐阶段的数据质量 ...
