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


推荐阅读
  • 本文介绍了 Go 语言中的高性能、可扩展、轻量级 Web 框架 Echo。Echo 框架简单易用,仅需几行代码即可启动一个高性能 HTTP 服务。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • 如何利用Java 5 Executor框架高效构建和管理线程池
    Java 5 引入了 Executor 框架,为开发人员提供了一种高效管理和构建线程池的方法。该框架通过将任务提交与任务执行分离,简化了多线程编程的复杂性。利用 Executor 框架,开发人员可以更灵活地控制线程的创建、分配和管理,从而提高服务器端应用的性能和响应能力。此外,该框架还提供了多种线程池实现,如固定线程池、缓存线程池和单线程池,以适应不同的应用场景和需求。 ... [详细]
  • Leetcode学习成长记:天池leetcode基础训练营Task01数组
    前言这是本人第一次参加由Datawhale举办的组队学习活动,这个活动每月一次,之前也一直关注,但未亲身参与过,这次看到活动 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 本文探讨了Go语言中iota关键字的具体含义及其在常量声明中的应用。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • 本文回顾了作者初次接触Unicode编码时的经历,并详细探讨了ASCII、ANSI、GB2312、UNICODE以及UTF-8和UTF-16编码的区别和应用场景。通过实例分析,帮助读者更好地理解和使用这些编码。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • Python全局解释器锁(GIL)机制详解
    在Python中,线程是操作系统级别的原生线程。为了确保多线程环境下的内存安全,Python虚拟机引入了全局解释器锁(Global Interpreter Lock,简称GIL)。GIL是一种互斥锁,用于保护对解释器状态的访问,防止多个线程同时执行字节码。尽管GIL有助于简化内存管理,但它也限制了多核处理器上多线程程序的并行性能。本文将深入探讨GIL的工作原理及其对Python多线程编程的影响。 ... [详细]
  • 深入浅析JVM垃圾回收机制与收集器概述
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)》的阅读心得进行整理,详细探讨了JVM的垃圾回收机制及其各类收集器的特点与应用场景。通过分析不同垃圾收集器的工作原理和性能表现,帮助读者深入了解JVM内存管理的核心技术,为优化Java应用程序提供实用指导。 ... [详细]
  • 并发编程入门:初探多任务处理技术
    并发编程入门:探索多任务处理技术并发编程是指在单个处理器上高效地管理多个任务的执行过程。其核心在于通过合理分配和协调任务,提高系统的整体性能。主要应用场景包括:1) 将复杂任务分解为多个子任务,并分配给不同的线程,实现并行处理;2) 通过同步机制确保线程间协调一致,避免资源竞争和数据不一致问题。此外,理解并发编程还涉及锁机制、线程池和异步编程等关键技术。 ... [详细]
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社区 版权所有