热门标签 | 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


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 使用C#开发SQL Server存储过程的指南
    本文介绍如何利用C#在SQL Server中创建存储过程,涵盖背景、步骤和应用场景,旨在帮助开发者更好地理解和应用这一技术。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
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社区 版权所有