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))
相关推荐
KoiHeng8 分钟前
操作系统简要知识
linux·笔记
巴伦是只猫1 小时前
【机器学习笔记Ⅰ】11 多项式回归
笔记·机器学习·回归
DKPT5 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
巴伦是只猫7 小时前
【机器学习笔记Ⅰ】13 正则化代价函数
人工智能·笔记·机器学习
好好研究7 小时前
学习栈和队列的插入和删除操作
数据结构·学习
新中地GIS开发老师8 小时前
新发布:26考研院校和专业大纲
学习·考研·arcgis·大学生·遥感·gis开发·地理信息科学
SH11HF9 小时前
小菜狗的云计算之旅,学习了解rsync+sersync实现数据实时同步(详细操作步骤)
学习·云计算
Frank学习路上9 小时前
【IOS】XCode创建firstapp并运行(成为IOS开发者)
开发语言·学习·ios·cocoa·xcode
Chef_Chen10 小时前
从0开始学习计算机视觉--Day07--神经网络
神经网络·学习·计算机视觉
X_StarX12 小时前
【Unity笔记02】订阅事件-自动开门
笔记·学习·unity·游戏引擎·游戏开发·大学生