![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Lua学习笔记
qq_42483286
这个作者很懒,什么都没留下…
展开
-
Lua学习笔记15:非抢先式的多线程
一、概念协同程序提供一种协作式的多线程。每个协同程序都等于是一个线程。一对yield-resume可以将执行权在不同线程之间切换。然而,协同程序与常规的多线程的不同之处在于,协同程序是非抢先式的。就是说,当一个协同程序在运行时,是无法从外部停止它的。只有当协同程序显示地要求挂起时(调用yield),它才会停止。对于有些应用而言,这没有问题,而对于另外一些应用则可能无法接受这种情况。当不存在抢先...原创 2020-04-22 22:36:56 · 405 阅读 · 0 评论 -
Lua学习笔记14:以协同程序实现迭代器
我们可以将循环的迭代器看作生产者-消费者模式的特殊的例子。一个迭代函数会产生一些值,而循环体会消费这些内容。所以可以使用协同程序也可以用来实现迭代器。的确,协同程序为实现这类任务提供一个非常有用的工具,即协同的一个关键特征是它可以不断修改调用者与被调用者之间的关系,这样我们毫无顾虑的使用它实现一个迭代器,而不用保存迭代函数返回的状态信息。我们来完成一个打印一个数组元素的所有的排列来阐明这种应用。...原创 2020-04-22 21:31:08 · 156 阅读 · 0 评论 -
Lua学习笔记13:管道和过滤器
一个关于协同程序的经典示例是“生产者-消费者”问题。这其中涉及到两个函数,一个函数不断地产生值(比如从一个文件中读取值),另一个则不断地消费这些值(比如将这些值写到另一个文件)。通常,这两个函数大致是这样的:function producer () while true do local x = io.read() -- 产生新的值 send(x)...原创 2020-04-22 20:37:50 · 168 阅读 · 0 评论 -
Lua学习笔记12:协同程序基础
协同程序同线程差不多,就是一条执行序列。拥有自己独立的栈、局部变量和指令指针。同时又和其他的协同程序共享全局变量和其他大部分东西。从概念上来讲,线程与协同程序的主要区别在于,一个具有多线程的程序可以同时运行多个线程;而协同程序却是需要彼此协作来运行,即一个具有多个程序的协同程序在任一指定时刻只有一个协同程序在运行,并且协同程序只有被显示地(执行挂起函数)要求挂起才会暂停。Lua将所有关于协...原创 2020-04-22 16:33:53 · 142 阅读 · 0 评论 -
Lua学习笔记11:Lua错误处理
一、Errare humanum est(拉丁谚语:犯错是人的本性)。所以我们要尽可能的防止错误的发生,Lua 经常作为扩展语言嵌入在别的应用中,所以不能当错误发生时简单的崩溃或者退出。相反,当错误发生时 Lua 结束当前的 chunk 并返回到应用中。当 Lua 遇到不期望的情况时就会抛出错误,比如:两个非数字进行相加;调用一个非函数的变量;访问表中不存在的值等(可以通过 metatables...原创 2020-04-22 16:26:14 · 728 阅读 · 0 评论 -
Lua学习笔记10:编译
尽管将Lua称为一种解释性的语言,但Lua确实允许在运行源代码前将源代码预编译为一种中间形式。听上去编译似乎不在一种解释性语言的范畴之列,其实区别解释性语言的特征并不在于是否能编译它们,而在于编译器在运行时是否为库的一部分,即是否有能力且能轻易的执行动态生成的代码。正是因为Lua存在了类似dofile这样的函数,才可以将Lua称之为一种解释性的语言一、Lua的dofile函数:dofile是一种...原创 2020-04-08 21:20:41 · 215 阅读 · 0 评论 -
Lua学习笔记09:复杂状态的迭代器(迭代器与泛型for-03)
一、具有复杂状态的迭代器:迭代器需要保存许多状态,可是泛型(for)却只提供了恒定状态和控制变量用于状态的保存。一个最简单的办法是使用closure。当然我们还以将所有的信息封装到一个table中,并作为恒定状态对象传递给迭代器。虽说恒定状态变量本身是恒定的,即在迭代过程中不会换成其它对象,但是该对象所包含的数据是否变化则完全取决于迭代器的实现。就目前而言,由于table类型的恒定对象已经包含了所...原创 2020-04-08 21:01:33 · 230 阅读 · 0 评论 -
Lua学习笔记08:无状态的迭代器(迭代器与泛型for-02)
无状态迭代器:一种自身不保存任何状态的迭代器。因此,我们可以在多个循环中使用同一个无状态的迭代器,避免创建新的closure 开销。(在一个迭代器方法中,其return直接返回一个或多个值,而不是在return后面创建一个新的函数)在每次迭代中,for循环都会用恒定状态和控制变量来调用迭代器函数。一个无状态的迭代器可以根据这两个值来为下次迭代生成下一个元素。这类迭代器的一个典型例子就是ipair...原创 2020-04-08 21:00:09 · 323 阅读 · 0 评论 -
Lua学习笔记07:迭代器与closure(迭代器与泛型for-01)
一、Lua迭代器:所谓“迭代器”就是一种可以遍历(iterate over)一种集合中所有元素的机制。在Lua中,通常将迭代器表示为函数。每调用一次函数,即返回集合中的“下一个”元素。每个迭代器都需要在每次成功调用之间保持一种状态,这样才能知道它所在的位置及如何进到下一个位置。closure对于这类任务提供了极佳的支持,一个closure就是一种可以访问外部嵌套环境中的局部变量的函数。对于clo...原创 2020-04-08 20:41:49 · 152 阅读 · 0 评论 -
Lua学习笔记06:深入函数(二)
一、非全局变量:Lua的函数不仅可以存储在全局的变量中,还可以存储在局部变量或者table的字段中(大部分的Lua库都采用了此种机制, 例如io.read,math.sin).如需创建这种函数,只需将常规的函数语法和table语法结合起来即可方法一:Lib = {}Lib.foo = function (x, y) return x+y endLib.goo = function (x...原创 2020-04-08 20:01:21 · 190 阅读 · 0 评论 -
Lua学习笔记05:深入函数(一)
一、Lua中函数也为第一类值:函数也可以存储到变量、table中;它可以作为实参传递给其他函数,也可以作为其他函数的返回值;词法域:一个函数可以嵌套到另一个函数中,内部的函数可以访问外部函数的变量;函数与其他值一样都是匿名的,Lua中的函数只是一个持有某函数方法的变量,函数名类似于变量名,我们也可以用多种方式来操作一个函数例:a={p=print}a.p("Hello")-->与pri...原创 2020-04-08 17:58:27 · 119 阅读 · 0 评论 -
Lua学习笔记04:Lua函数简介
Lua函数一、在Lua中,函数是对语句和表达式进行抽象的主要方法。既可以用来处理一些特殊的工作,也可以用来计算一些值。Lua 提供了许多的内建函数,你可以很方便的在程序中调用它们,如print()函数可以将传入的参数打印在控制台上。Lua 函数主要有两种用途:1.完成指定的任务,这种情况下函数作为调用语句使用;print("Hello World")2.计算并返回值,这种情况下函数作为赋...原创 2020-04-08 17:43:10 · 598 阅读 · 0 评论 -
Lua学习笔记03:Lua语句
一、Lua中赋值为修改一个变量或table中某索引的值Lua允许多重赋值,多个值赋值给多个变量,每个变量和值用","隔开,若等号右边有表达式,Lua会先求出表达式的值,然后再赋值(例:a,b=10,2*x -->a=10 b=2*x)x,y=y,x a[i],a[j]=a[j],a[i](相当于交换两个变量) 若多重赋值时变量数大于赋值的值,则多出来的变量会被自动赋为nil;若...原创 2020-04-08 15:50:13 · 309 阅读 · 0 评论 -
Lua学习笔记02:Lua表达式
Lua表达式一、Lua表达式可以包含常量、字符串、自变量、一元操作符、函数调用、函数定义和table构造式二、Lua支持的算术操作符:+加、-减、*乘、/除、^求幂(求开根号后的结果)、%取模(该取模运算符可以用于小数;例3.5%1=0.5;想取小数点后几位的数就用原数减去原数取小数点后几位的摸即可,例:a=5.382,5.38=a-a%0.01)、-负号三、Lua支持的关系操作符:<...原创 2020-04-08 15:39:30 · 1153 阅读 · 0 评论 -
Lua学习笔记01:书写格式及部分类型的简单介绍
一、Lua语言书写格式Lua语言可以不用添加“;”来作为一句语句的结束变量名不能以数字开头,不能以Lua关键字为名字Lua语言识别大小写,因此与Lua关键字字母相同但字母大小写的话可以作为变量名未赋值的变量在显示时会显示”nil“如果不再使用某个全局变量,则将该全局变量赋值为”nil“即可(a=nil)二、解释器程序(解释器程序让控制台直接使用Lua语言)格式:lua 选项参数 ...原创 2020-04-08 15:12:36 · 1171 阅读 · 0 评论