![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Lua脚本语言
守love唯诺
程序猿
展开
-
第九课 协同程序
协同程序与线程差不多,也就是一条执行序列,拥有自己独立的栈、局部变量和指令指针,同时又与其他协同程序共享全局变量和其他大部分东西。从概念上讲线程与协同程序的只要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作地运行。就是说,一个具有多个协同程序的程序在任意时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显示地要求挂起时,它的执行才会暂停。协同程序基原创 2016-12-14 17:31:43 · 577 阅读 · 0 评论 -
第十八课 数学库
math库由一组标准的数学函数构成,包括:三角函数:(都是用弧度单位)sincostanasinacosdeg(弧度转角度)rad(角度转弧度)等指数和对数函数:exploglog10取整函数:floor(向下取整)ceil(向上取整)max和min伪随机数函数:randomrandomseed变量:pih原创 2017-01-04 10:32:30 · 482 阅读 · 0 评论 -
第十九课 table库
table库是由一些辅助函数构成的,这些函数将table作为数组来操作。插入和删除函数table.insert用于将一个元素插入到一个数组的指定位置,它会移动后续元素以空出空间。如果在调用insert时没有指定位置参数,则会将元素添加到数组末尾。t = {10, 20, 30}table.insert(t, 1, 15) --t = {15, 10, 20, 30}下面原创 2017-01-04 11:24:51 · 505 阅读 · 0 评论 -
第十四课 环境
Lua将其所有的全局变量保存在一个常规的table中,这个table称为“环境”。Lua将环境table自身保存在一个全局变量_G中。for n in pairs(_G) do print(n) end --打印当前环境中所有全局变量的名称具有动态名字的全局变量对于访问和设置全局变量,通常赋值操作就可以了。不过有时也会用到一些元编程的形式。例如,当操作一个全局变量时,而它的名称原创 2016-12-27 17:08:44 · 242 阅读 · 0 评论 -
第二十课 字符串库
原始的Lua解释器操作字符串的能力是很有限的。一个程序只能创建字符串常量、连接字符串以及获取字符串的长度。它无法提取子串或者检索字符串的内容。在Lua中真正的字符串操作能力来源于字符串库。字符串库中的所有函数都 导出在模块string中。在Lua5.1中,它还将这些函数导出作为string类型的方法。所以有两种方法调用字符串库中的函数,string.upper(s)或者s:upper()。原创 2017-01-05 13:53:51 · 314 阅读 · 0 评论 -
第十五课 模块与包
从用户观点来看,一个模块就是一个程序库,可以通过require来加载。然后便得到了一个全局变量,表示一个table。这个table就像是一个名称空间,其内容就是模块中导出的所有东西,如函数和常量。一个规范的模块还应使require返回这个table。一个用于要调用一个模块中的 函数,最简单的方式是:require "mod"mod.foo()如果希望使用较短的名称,则可以为模块设置原创 2016-12-29 13:40:32 · 312 阅读 · 0 评论 -
第二十一课 I/O库
I/O库为文件操作提供了两种不同的模型,简单模型和完整模型。简单模型假设有一个当前输入文件和一个当前输出文件,它的I/O操作均作用于这些文件。完整模型则使用 显式的文件句柄。它采用了面向对象的风格,并将所有的操作定义为文件句柄上的方法。简单I/O模型简单模型的所有操作都作用于两个当前文件。I/O库将当前输入文件初始化为进程标准输入,将当前输出文件初始化为进程标准输出。在执行io原创 2017-01-06 16:34:15 · 391 阅读 · 0 评论 -
第十六课 面向对象编程
Lua中的table就是一种对象,这句话从3个方面来证实:1、table与对象一样可以拥有状态。2、table也与对象一样拥有一个独立于其值的 标识(一个self)。例如,两个具有相同值的对象(table)是两个不同的对象。3、table与对象一样具有独立于创建者和创建地的生命周期。table也有和对象一样的操作:Account = {balance = 0}functio原创 2016-12-30 15:22:04 · 343 阅读 · 0 评论 -
第二十四课 C API概述
Lua是一种嵌入式语言,即Lua不是一个单独运行的程序,而是一个可以链接到其他程序的库。通过链接就可以将Lua的功能合并入这些程序。如果Lua不是一个独立运行的程序,那么之前我们使用的Lua程序是怎么来的呢?这个问题的答案是Lua解释器,即可执行程序“lua”。这个解释器是一个简单的应用程序,它依靠Lua库来实现主要功能。这个程序会处理 与用户的交互,它将用户的文件或字符串输入Lua库,由Lu原创 2017-02-07 15:49:51 · 588 阅读 · 0 评论 -
第二十二课 操作系统库
操作系统库定义在table os中,其中包含了文件操作函数、获取当前日期和时间 的函数,以及其他一些与操作系统相关的功能。Lua只使用了 ANSI标准中定义的函数,而像目录操作和套接字这类操作系统功能并不是ANSI标准的一部分,因此操作系统库也就不包含它们了。posix库为Lua提供了POSIX.1标准的功能luasocket库提供了网络支持对于文件操作而言,库只提供了两个函数,一个是原创 2017-01-17 14:30:01 · 299 阅读 · 0 评论 -
第二十三课 调试库
调试库并没有提供一个Lua的调试器,而是提供了一个编写调试器所必须具有的原语。考虑到性能因素,这些原语的标准接口是通过C API给出的。而Lua中的调试库则提供了一条在Lua代码 中直接访问这些接口的途径。调试库与其他库不同,必须慎重使用。因为,首先它的一些功能性能不高。其次,它会打破语言的一些固有原则,例如用户无法在一个函数之外访问这个函数内部创建的局部变量。通常,用户不会希望在产品的最原创 2017-01-19 09:36:13 · 434 阅读 · 0 评论 -
第二十五课 扩展应用程序
基础第一个任务是一个简单的配置应用。假设C程序有一个窗口,并希望用户指定窗口的初始大小。显然,对于这种简单的任务,有多种比Lua 更简单的做法,例如使用环境变量或者使用记录了名值对的文件。不过就算使用一个简单的文本文件,也需要进行分析。因此使用Lua来作为配置文件。下面是这种文件最简单的形式,它可以包含如下内容:--定义窗口大小width = 200height = 300此时原创 2017-05-04 10:43:08 · 411 阅读 · 0 评论 -
第十七课 弱引用table
Lua采用了自动内存管理,一个程序只需要创建对象,不需要删除对象。Lua的垃圾收集器没有 环形引用的问题。当用到环形数据结构时,无须作出任何特殊的处理,它们也可以像其他数据一样被正常的回收。垃圾收集器 只能回收那些它认为是垃圾的东西,它不会回收那些用户认为是垃圾的东西。一个典型的例子就是栈。栈通常由一个数组和一个表示顶部的索引来实现。这个数组的有效部分总是向顶部扩展的,但Lua却不知道。如原创 2017-01-04 09:46:53 · 397 阅读 · 0 评论 -
第十二课 数据文件与持久性
数据文件可以借由table构造式来定义一种文件格式。只需要在写数据时做一点额外的工作,读取数据就会变得相当容易。这项技术也就是将数据作为Lua代码 输出,当运行这些代码时,程序也就读取了数据。而table的构造式可以使这些输出代码看上去更像是一个普通的数据文件。如果数据文件是一种预定义的格式,例如CSV(逗号分割值)或XML,那么可以选择的做法就很少。不过,如果是为了应用而创建的数据文件的原创 2016-12-19 15:24:37 · 293 阅读 · 0 评论 -
第七课 迭代器与泛型for
迭代器就是一种可以遍历一种集合中所有元素的机制。在Lua中,通常将迭代器表示为函数。每调用一次函数,即返回集合中的“下一个”元素。每个迭代器都需要在每次成功调用之间保持一些状态,这样才能知道它所在的位置及如何步进到下个位置。closure对于这类任务提供了极佳的支持,一个closure就是一种可以访问其外部嵌套环境中的局部变量的函数。为了创建一个新的closure,还必须要创建它的这些原创 2016-12-12 17:07:03 · 529 阅读 · 0 评论 -
第八课 编译、执行与错误
尽管Lua称为是一种解释型的语言,但Lua确实允许在运行源代码前,先将源代码预编译为一种中间形式。其实,区别解释型语言的主要特征并不在于是否能编译他们,而是在于编译器是否是语言运行时库的一部分,即是否有能力执行动态生成的代码。可以说正是因为存在了诸如dofile这样的函数,才可以将Lua称为一种解释型语言。编译dofile函数,是一种内置的操作,用于运行Lua代码块。但实际上dof原创 2016-12-13 14:39:23 · 544 阅读 · 0 评论 -
第一课 简介Lua 开始
几条连续的Lua语句之间并不需要分隔符,但可以使用分隔符分号(;)隔开在Lua语法中,代码中的换行不起任何作用。a=1 b=a*2 --有点难看,但是是合法的Lua交互式模式,使用lua命令进入,退出使用end-of-file控制字符,或者调用操作系统库函数exit,输入os.exit()应该避免使用_+大写字母的标识符,Lua将这类标识符保留用作特殊用途保留标原创 2016-12-09 09:44:01 · 391 阅读 · 0 评论 -
第二课 类型和值
Lua是一种动态类型语言。没有类型定义的语法。每个值都携带了它自身的类型信息。8种基础类型:nil(空) boolean(布尔) number(数字)string(字符串) userdata(自定义类型) function(函数)thread(线程) table(表)函数type可 根据一个值返回其类型名称。print(type("hello world")) -->strin原创 2016-12-09 09:45:37 · 234 阅读 · 0 评论 -
第三课 表达式
Lua中的表达式中可以包含数字常量、字面字符串、变量、一元和二元操作符及函数调用。还可以包括函数定义和table 构造式。算术操作符二元:+、-、*、/、^(指数)、%(取模,Lua5.1新增)一元:-(负号)如:x^0.5 --x的平方根x^(-1/3) --x立方根的倒数取模操作是根据以下规则定义的:a % b == a - floor(a / b) * b原创 2016-12-09 09:46:52 · 249 阅读 · 0 评论 -
第四课 语句
赋值、控制和过程调用赋值Lua允许“多重赋值”,也就是一下子将多个值赋予多个变量。每个值或每个变量之间以逗号隔开。a, b = 10, 2 * x在多重赋值中,Lua先对等号右边的所有元素求值,然后才执行赋值。这样便可以用一句多重赋值来交换两个变量了。x, y = y, x --交换x与ya[i], a[j] = a[j], a[i] --交换a[i]与a[j]原创 2016-12-09 09:49:22 · 191 阅读 · 0 评论 -
第五章 函数
在Lua中,函数是对语句和表达式进行抽象的主要机制。即使调用函数时没有参数,也必须要写出一对空括号。一种特殊的例外情况:一个函数若只有一个参数,且此参数是一个字面字符串或table构造式,那么圆括号别是可有可无的。print "Hello World"dofile 'test.lua'print [[ a multi-linemessage]]f {x = 0, y =原创 2016-12-09 13:31:33 · 356 阅读 · 0 评论 -
第六课 深入函数
在Lua中,函数是一种“第一类值”(和数字、字符串等一样,具有相同的权利),它们具有特定的词法域(一个函数可以嵌套在另一个函数中,内部函数可以访问外部函数中的变量)。函数式语言,函数式编程。在Lua中有一个容易混淆的概念是,函数与其他所有值一样 都是匿名的,即它们都没有名称。当讨论一个函数名时(例如print),实际上是在讨论一个持有某函数的变量。这与其他变量持有各种值是一样的道理。可以以多种原创 2016-12-09 16:31:39 · 845 阅读 · 0 评论 -
第十一课 Lua实现相关数据结构
Lua中的table不是一种简单的数据结构,它可以作为其他数据结构的基础。其他语言提供的数据结构,如数组、记录、线性表、队列、集合等,在Lua中都可以通过table来表示。数组使用整数来索引table即可在Lua中实现数组。 因此,数组没有一个固定的大小,可以根据需要增长。长度操作符 #计算数组的大小可以使用0、1或其他任意值来作为数组的起始索引。在Lua中习惯一般以1原创 2016-12-16 11:06:47 · 1261 阅读 · 0 评论 -
第十课 完整的Lua代码示例
马尔可夫链算法根据原始文本中n个单词的序列来确定后面的单词,从而生成随机的文本。程序先读取原始文本,并创建一个table。table的创建过程为:以每两个单词 为一个前缀,在table中创建一个列表,该列表记录了原始文件中所有位于该前缀之后的单词。当构建好这个table后,程序就利用它来生成随机文本。结果中的每个单词都来自于它在原始文本中的前缀,而具有相同前缀的单词出现在结果中的概率也与原原创 2016-12-15 14:47:10 · 1558 阅读 · 0 评论 -
第十三课 元表(metatable)与元方法(metamethod)
通常,Lua中的每个值都有一套预定义的操作集合。例如,可以将数字相加,可以连接字符串,还可以在table中插入一对key-value等。但是我们无法将两个table相加,无法对函数作比较,也无法调用一个字符串。可以通过元表来修改一个值的行为,使其可以在面对一个非预定义的操作时执行一个指定的操作。例如,假设a和b是两个table,通过元表可以定义如何计算表达式a+b。当Lua试图将两个table原创 2016-12-22 13:46:16 · 1428 阅读 · 0 评论 -
第二十六课 从Lua调用C
扩展Lua的一项基本含义就是,应用程序将新的C函数注册到Lua中。Lua能调用C函数,但并不意味着Lua可以调用任意C函数。在上一章中,当C语言调用Lua函数时,它必须 遵循一个简单的协议,以此来向Lua传递参数,并从Lua获取结果。同样,对于一个能被Lua调用的C函数,它也必须遵循一个获取参数和返回结果的协议。此外,还必须注册C函数,以便用某种适当的方式将函数地址告诉Lua。当Lua调用原创 2017-05-04 15:54:57 · 420 阅读 · 0 评论