热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

lua学习笔记

简介Lua是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua是巴西里约热内卢天主教大学(P




简介

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

Lua 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组于 1993 年开发的


设计目的

为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。


lua特性


  • 轻量级: 它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。
  • 可扩展: Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。
  • 其它特性
    • 支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
    • 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
    • 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
    • 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。

应用场景


  • 游戏开发
  • 独立应用脚本
  • Web 应用脚本
  • 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
  • 安全系统,如入侵检测系统

基本语法

输出

print(“内容”)


注释

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


关键字


andordoifelseelseif
breakendforthenwhilelocal
returnrepeatfalsetrueinnot
nilfunctionuntilgoto

数据类型

nil


boolean


number


function


table


userdata


thread


数据类型描述
nil空类型,表示一个无效值,条件表达式中为false
booleanfalse和true,表达式中只有nil和false使条件为false,其他均为true包括(0)
number双精度类型的实浮点数
string字符串类型,由一对双引号或单引号表示
function由c或lua编写的函数
table表(关联数组),成员可以使数字、字符串或表类型。通过{}构造表达式
userdata自定义类型,表示任意存储在变量中的c数据结构
thread线程,执行协同程序


lua变量


全局变量

Lua 中的变量全是全局变量,那怕是语句块或是函数里,除非用 local 显式声明为局部变量。

a=10

局部变量

局部变量的作用域为从声明位置开始到所在语句块结束(代码块)。

代码块:控制结构,函数体,chunk(变量声明的文件或字符串)

局部变量好处

1、避免名字冲突

2、访问速度快

locat a=10

表中域


多变量同时赋值

Lua 可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量。

a, b = 10, 2*x <--> a=10; b=2*x

强制类型转化

//string转number
print(tonumber("10"+10)) //20
//number转string
print(tostring(13).."25") //1325

运算符

算术运算符

只能在数字之间运算


二元运算符

两个数之间(+,-,*,/,^)

print (a+b)

一元运算符

一个数(-)负数

print(-10)

关系运算符

(==,~=,> , >= , <. <= )

关系运算符返回值是boolean值(false/true)

userdata,table,function只有指向对象为同一个是才能比较是否(==)


逻辑运算符

and,or 运算结果与操作数相关

print(1 and 100) //100 取大值
print(1 or 100) //1 取小值
print(true or false) //false
print(true or false) //true

连接运算符

(…) 对数字或字符串进行连接

数字连接

print(12 .. 24) //1224

字符串连接

print("love".."you") //loveyou

优先级

^ 幂

not, - 否,负数

*, / 乘除

+, - 加减

… 连接

==,~=,>,>=,<,<= 关系

and 逻辑与

or 逻辑或


表的初始化

a={}

a={x=100,y=200}
print(a.x,a.y)

基本语法

赋值交换

a=100
b=200
a,b=b,a //a=200,b=100

控制结构语句


if

if conditions then
then-part
end

if conditions then
then-part
else
else-part
end

if conditions then
then-part
else if conditions then
then-part
……
else else-part
end

a=1
b=2
if a>b then
print("a>b")
else if a print("aelse print("a=b")
end
end //a=b

while

先条件判断,再循环

while conditions do
statement
end

b=10
while b<20 do
print(b)
b=b+1
end //10 11 12 13 14 15 16 17 18 19

repeat-until

先循环,再条件判断

repeat
statement
until conditions

b=10
repeat
print(b)
b=b+1
until b>20 //10 11 12 13 14 15 16 17 18 19 20

for数值循环

for var=exp1,exp2,exp3 do //(起始值,终止值,每次增加值)//exp不写时默认为1
statement
end

for i=1,21,2 do
print(i)
end //1 3 5 7 9 11 13 15 17 19 21

for i=10,0,-1 do
print(i)
end //10 9 8 7 6 5 4 3 2 1 0

for泛型循环

pairs 迭代器(完全遍历)可以检索表中所有数据类型,但检索顺序不能保证, ipairs只能检索数组

for k,v in ipairs(t) do//(k表中数据编号,v表中数据内容,t表名)
end

t1={"l","o","v","e"} //表中不同数据间要加 “,”
for k,v in ipairs(t1) do
print(v)
end

break

退出循环

for i=1,100,2 do
if i==21 then break
else print(i) end
end //1 3 5 7 9 11 13 15 17 19 21

return

函数返回值

function add(a,b)
return a+b
end
print(add(100,200))

函数

定义

//1、
function func_name(argument-list) //(函数名 参数列表)
statement-list //语句
end
//2、
func_name=function(argment-list)
statement-list
end
//3、表中定义函数
tab={}
tab.func_name=function(argument-list)
statement-list
end
//4、
tab={}
tab={func_name=funcation(argument-list)
statement-list
end}
//5、
tab={}
function tab.func_name(argument-list)
statement-list
end

//1
function add(a,b)
return a+b
end
//2
add=function(a,b)
return a+b
end
//3
tab={}
tab.add=function(a,b)
return a+b
end
//4
tab={}
tab={add=function(a,b)
return a+b
end}
//5、常用
tab={}
function tab.add(a,b)
return a+b
end

//可变参数
tab={}
function tab.sum(...) //参数数量未指定
local s=0
for k,v in ipairs(arg) do //arg 还未指定的参数个数
s=s+v
end
return s
end
print(tab.num(1,2,3,4,5))

闭包

一个函数定义在另一个函数内部

“closure”,lua将其解释为闭包,它具有着这种特性:将一个函数写在另一个函数之内,那么这个位于内部的函数便可以访问外部函数中的局部变量,这项特性称之为词法域。

function out_func(argument-list)
local var;
return function(argument-list)
end
end

function newCounter()
local i=0
return function() //内部函数
i=i+1 //使用外部函数的局部变量
return i
end
end
c1=newCounter()
print(c1()) //1
print(c1()) //2
print(c1()) //3

函数调用

1、一般调用方式function(argument-list)

2、只有一个参数时(字符串或表) 括号()可省

3、tab:func_name(argument)->tab.func_namee(tab,argment)

4、闭包的调用

5、调用函数的实参和形参个数不等

6、尾调用(一个函数的最后一个动作是调用另一个函数)

//常用
function(argument-list)
add(a,b)
//表中调用
table_name,function_name(argument-list)
tab.add(1,2)

//尾调用
function aa()
return 1
end
function bb()
a=a+1
b=b+1
return aa()+1
end

//表做函数参数
function sum(tab)
local sum=0
for k,v in ipairs(tab) do
sum=sum+v;
end
return sum
end
function mul(tab)
local sum=1
for k,v in ipairs(tab) do
sum=sum*v
end
return sum
end
tab={1,2,3,4}
print(sum(tab))
print(mul(tab))

迭代器和泛型


协程

进程

​ 正在运行的程序的实例


线程

​ 进程内一个相对独立的,可调度的执行单元,是系统独立调度和分派cpu的基本单位,是运行中的程序的调度单位


协程

​ 协作程序,协程之间通过协作(函数调用)完成一个既定任务,同一时间只有一个指令在执行

coroutine.create() //协程创建
coroutine.yield() //协程暂停
coroutine.resume() //运行协程
coroutine.status() //查看协程状态

//运行协程
function f()
print("hello")
end
co=coroutine.create(f)
coroutine.resume(co)
// hello

//完整的协程过程
function f1()
while true do
local res,v1,v2=coroutine.resume(c2,100,300)
print(v1,v2)
end
end
c1=coroutine.create(f1)
function f2()
while true do
local v1,v2=coroutine.yield(1,3)
print(v1,v2)
end
end
c2=coroutine.create(f2)
coroutine.resume(c1) //100 300 1 3 重复打印

数据结构

lua只有table的数据结构,数组、链表、队列需要从table扩展


数组

lua中通过下标访问的元素就可以实现数组

一位数组

t={1,2,3,4} //t[1],t[2],t[3] lua数组从1 开始
print(t[1]) // 1

二维数组

t={{1,2},{3,4},{5,6}}
print(t[2][1]) //3

链表

t={1,2,3,4}
n=table.getn(t)
list=null
for i=1,n do
list={val=t[i],next=list}
end
print(list.val,list.next.val,list.next.next.val,list.next.next.next.val)

//定义迭代函数
function ipairs_iter(t,node)
if node==nil then return t
else return node.next

//初始化函数
function ipairs_list(t)
return lpairs_iter,t,nil //返回迭代函数
//遍历链表
for node in ipairs_list(list) do
print(node.val)
end

//删除节点
function delnode(val)
for node inpairs_list(list) do
if node.next~=nil and node.next.val==val then
local p=node.next
node.next=p.next
p.next=nil
end
end
end
delnode(list,3);

队列


元表

(_函数)实现两个表算术操作 (相加)(__add)

//元表相加
a={1,2,3}
b={1,2,3}
mt={}
mt.__add=function(a,b) //定义元表
local len=table.getn(a)
local res={}
for i=1,len do
res[i]=a[i]+b[i]
end
return res
end
setmetatable(a,mt) //设置元表
setmetatable(b,mt)
c=a+b
for k,v in ipairs(c) do
print(v)
end // 2 4 6

//元表 连接
a={1,2,3}
b={1,2,3}
mt={}
mt.__cOncat=function(a,b)
local len=table.getn(a)
local res={}
for i=1,len do
res[i]=a[i]..b[i]
end
return res
end
setmetatable(a,mt)
setmetatable(b,mt)
c=a..b
for k,v in ipairs(c) do
print(v)
end // 11 22 33

包(package)

//foo.lua 包
local class={}
function class.foo(a,b)
return a+b
end
return class

//调用包 require函数查找文件
local c=require("foo")
print(c.foo(1,2))

系统库

// table.insert(t,i) t表名
local t={}
for i=1,10 do
table.insert(t,i)
end
for k,v in ipairs(t) do
print(k,v)
end

//table中的各类函数 t表名 1开始数
table.setn
table.insert(t,1)
table.getn(t) //计算表t长度
table.foreachi
table.maxn //得到最大索引值
table.foreach
table.concat
table.sort
table.remove(t,2) //删除表t中的2值

//自定义字符串格式
string.format("hello%d",2)
print(string.format("hello %d",2))

面向对象特性实现

通过复制表方式实现面向对象特性,类,继承

--复制函数
function clone(tab)
local ins={}
for k,v in pairs(tab) do
ins[key]=v
end
return ins
end
function copy(dist,tab)
for k,v in pairs(tab) do
dist[key]=v
end
end
people={}
people.say=function(self)
print("people say hi"..self.name)
end
people.new=function(name)
local self=clone(people)
self.name=name
return self
end
--复制people类创建类实例
local p=people.new("ZhangSan")
p.say(p)
--p:say(p)
man={}
man.new=function(name)
local self=people.new(name)
copy(self,man)
return self
end


推荐阅读
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
author-avatar
丁木China
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有