lua技术
文章平均质量分 89
经典讲述lua从基本功到精通使用
昔拉天使
I wanna the world know my existence.
展开
-
Lua与C API交互全面解析(史上最全的整理)
C API 纵览Lua 是一个嵌入式的语言,意味着 Lua 不仅可以是一个独立运行的程序包也可以是一个用来嵌入其他应用的程序库。你可能觉得奇怪:如果 Lua 不只是独立的程序,为什么到目前为止贯穿整本书我们都是在使用 Lua 独立程序呢?这个问题的答案在于 Lua 解释器(可执行的 lua)。Lua 解释器是一个使用 Lua 标准库实现的独立的解释器,她是一个很小的应用(总共不超过 500 行的...原创 2020-02-21 18:03:04 · 10060 阅读 · 2 评论 -
Lua单元测试编写指南
需要注意的是,因为我们phonest框架内hook了_G,所以我们需要在init传入需要使用的global变量,其中"testXXXX"就是我们此次需要测试的function。luaunit原始框架不支持协程模式,但是我们phonest框架的RPC以及Timer是依赖底层c++回调的,需要有一定的驱动时间,我们将这些语义封装到了框架内部,外部测试者,不再需要关注底层细节,我们以TimerManager为例进行说明。需要注意的是,在第24行,我们需要return 0,告知外部不需要额外的等待时间。原创 2023-02-21 10:17:32 · 274 阅读 · 0 评论 -
Lua Debug库(标准库相关)
Debug 库debug 库并不给你一个可用的 Lua 调试器,而是给你提供一些为 Lua 写一个调试器的方便。出于性能方面的考虑,关于这方面官方的接口是通过 C API 实现的。Lua 中的debug 库就是一种在 Lua 代码中直接访问这些 C 函数的方法。Debug 库在一个 debug 表内声明了他所有的函数。与其他的标准库不同的是,你应该尽可能少的是有 debug 库。首先,debu...原创 2020-02-21 16:22:23 · 619 阅读 · 0 评论 -
Lua操作系统库(标准库相关)
操作系统库操作系统库包含了文件管理,系统时钟等等与操作系统相关信息。这些函数定义在表(table)os 中。定义该库时考虑到 Lua 的可移植性,因为 Lua 是以 ANSI C 写成的,所以只能使用 ANSI 定义的一些标准函数。许多的系统属性并不包含在 ANSI 定义中,例如目录管理,套接字等等。所以在系统库里并没有提供这些功能。另外有一些没有包含在主体发行版中的 Lua 库提供了操作系统...原创 2020-02-21 15:03:25 · 574 阅读 · 0 评论 -
Lua IO库(标准库相关)
IO 库I/O 库为文件操作提供两种模式。简单模式(simple model)拥有一个当前输入文件和一个当前输出文件,并且提供针对这些文件相关的操作。完全模式(complete model)使用外部的文件句柄来实现。它以一种面对对象的形式,将所有的文件操作定义为文件句柄的方法。简单模式在做一些简单的文件操作时较为合适。在本书的前面部分我们一直都在使用它。但是在进行一些高级的文件操作的时候...原创 2020-02-21 13:43:02 · 581 阅读 · 0 评论 -
Lua String 库(标准库相关)
String 库Lua 解释器对字符串的支持很有限。一个程序可以创建字符串并连接字符串,但不能截取子串,检查字符串的大小,检测字符串的内容。在 Lua 中操纵字符串的功能基本来自于 string 库。String 库中的一些函数是非常简单的:string.len(s)返回字符串 s 的长度;string.rep(s, n)返回重复 n 次字符串 s 的串;你使用 string.rep(“a”,...原创 2020-02-20 19:42:51 · 1366 阅读 · 0 评论 -
LuaTable 库(标准库相关)
Table 库table 库由一些操作 table 的辅助函数组成。他的主要作用之一是对 Lua 中 array 的大小给出一个合理的解释。另外还提供了一些从 list 中插入删除元素的函数,以及对 array元素排序函数。数组大小Lua 中我们经常假定 array 在最后一个非 nil 元素处结束。这个传统的约定有一个弊端:我们的 array 中不能拥有 nil 元素。对大部分应用来说这个...原创 2020-02-20 19:38:44 · 509 阅读 · 0 评论 -
Lua数学库(标准库相关)
数学库在这一章中(下面关于标准库的几章中同样)我的主要目的不是对每一个函数给出完整地说明,而是告诉你标准库能够提供什么功能。为了能够清楚地说明问题,我可能会忽略一些小的选项或者行为。主要的思想是激发你的好奇心,这些好奇之处可能在参考手册中找到答案。数学库由算术函数的标准集合组成,比如三角函数库(sin, cos, tan, asin, acos, etc.),幂指函数(exp, log, lo...原创 2020-02-20 19:35:52 · 491 阅读 · 0 评论 -
Lua弱引用table
Weak 表Lua 自动进行内存的管理。程序只能创建对象(表,函数等),而没有执行删除对象的函数。通过使用垃圾收集技术,Lua 会自动删除那些失效的对象。这可以使你从内存管理的负担中解脱出来。更重要的,可以让你从那些由此引发的大部分 BUG 中解脱出来,比如指针挂起(dangling pointers)和内存溢出。和其他的不同,Lua 的垃圾收集器不存在循环的问题。在使用循环性的数据结构的时候...原创 2020-02-20 19:03:12 · 427 阅读 · 0 评论 -
Lua Single--Method 的对象实现方法(面向对象程序设计)
前面的 OO 程序设计的方法有一种特殊情况:对象只有一个单一的方法。这种情况下,我们不需要创建一个接口表,取而代之的是,我们将这个单一的方法作为对象返回。这听起来有些不可思议,如果需要可以复习一下 7.1 节,那里我们介绍了如何构造迭代子函数来保存闭包的状态。其实,一个保存状态的迭代子函数就是一个 single-method 对象。关于 single-method 的对象一个有趣的情况是:当这...原创 2020-02-20 08:47:47 · 488 阅读 · 0 评论 -
Lua私有性(面向对象程序设计)
私有性(privacy)很多人认为私有性是面向对象语言的应有的一部分。每个对象的状态应该是这个对象自己的事情。在一些面向对象的语言中,比如 C++和 Java 你可以控制对象成员变量或者成员方法是否私有。其他一些语言比如 Smalltalk 中,所有的成员变量都是私有,所有的成员方法都是公有的。第一个面向对象语言 Simula 不提供任何保护成员机制。如前面我们所看到的 Lua 中的主要对象设...原创 2020-02-20 08:46:25 · 930 阅读 · 0 评论 -
Lua继承(面向对象的程序设计)
继承通常面向对象语言中,继承使得类可以访问其他类的方法,这在 Lua 中也很容易现实:假定我们有一个基类 Account:Account = {balance = 0} function Account:new (o) o = o or {} setmetatable(o, self) self.__index = self return o end function A...原创 2020-02-20 05:58:24 · 369 阅读 · 0 评论 -
Lua类(面向对象程序设计)
面向对象程序设计Lua 中的表不仅在某种意义上是一种对象。像对象一样,表也有状态(成员变量);也有与对象的值独立的本性,特别是拥有两个不同值的对象(table)代表两个不同的对象;一个对象在不同的时候也可以有不同的值,但他始终是一个对象;与对象类似,表的生命周期与其由什么创建、在哪创建没有关系。对象有他们的成员函数,表也有:Account = {balance = 0} function A...原创 2020-02-20 04:40:33 · 1960 阅读 · 0 评论 -
Lua Packages
Packages很多语言专门提供了某种机制组织全局变量的命名,比如 Modula 的 modules,Java和 Perl 的 packages,C++的 namespaces。每一种机制对在 package 中声明的元素的可见性以及其他一些细节的使用都有不同的规则。但是他们都提供了一种避免不同库中命名冲突的问题的机制。每一个程序库创建自己的命名空间,在这个命名空间中定义的名字和其他命名空间中定...原创 2020-02-20 02:19:31 · 899 阅读 · 0 评论 -
Lua环境
使用动态名字访问全局变量通常,赋值操作对于访问和修改全局变量已经足够。然而,我们经常需要一些原编程(meta-programming)的方式,比如当我们需要操纵一个名字被存储在另一个变量中的全局变量,或者需要在运行时才能知道的全局变量。为了获取这种全局变量的值,有的程序员可能写出下面类似的代码: loadstring("value = " .. varname)() or value =...原创 2020-02-19 04:31:40 · 527 阅读 · 0 评论 -
Lua Metatables and Metamethods
算术运算的 Metamethods这一部分我们通过一个简单的例子介绍如何使用 metamethods。假定我们使用 table来描述结合,使用函数来描述集合的并操作,交集操作,like 操作。我们在一个表内定义这些函数,然后使用构造函数创建一个集合:Set = {} function Set.new (t) local set = {} for _, l in ipairs(t) do ...原创 2020-02-18 08:51:09 · 350 阅读 · 0 评论 -
Lua数据文件与序列持久化
序列化我们经常需要序列化一些数据,为了将数据转换为字节流或者字符流,这样我们就可以保存到文件或者通过网络发送出去。我们可以在 Lua代码中描述序列化的数据,在这种方式下,我们运行读取程序即可从代码中构造出保存的值。通常,我们使用这样的方式 varname = 来保存一个全局变量的值。varname 部分比较容易理解,下面我们来看看如何写一个产生值的代码。对于一个数值来说:function se...原创 2020-02-18 00:49:46 · 463 阅读 · 0 评论 -
Lua用table实现数据结构
数据结构table 是 Lua 中唯一的数据结构,其他语言所提供的其他数据结构比如:arrays、records、lists、queues、sets 等,Lua 都是通过 table 来实现,并且在 lua 中 table 很好的实现了这些数据结构。在传统的 C 语言或者 Pascal 语言中我们经常使用 arrays 和 lists(record+pointer)来实现大部分的数据结构,在 ...原创 2020-02-17 07:52:08 · 1409 阅读 · 0 评论 -
Lua使用完整示例
我们看两个完整的例子来阐明 Lua 语言的使用。第一个例子来自于 Lua 网站,他展示了 Lua 作为数据描述语言的使用。第二个例子讲解了马尔可夫链算法的实现,这个算法在 Kernighan & Pike 著作的 Practice of Programming 书中也有描述。这两个完整的例子之后,Lua 语言方面的介绍便到此结束。后面将继续介绍 table 和面向对象的内容以及标准库、...原创 2020-02-16 21:53:30 · 2849 阅读 · 0 评论 -
Lua协同程序
协同程序协同程序(coroutine)与多线程情况下的线程比较类似:有自己的堆栈,自己的局部变量,有自己的指令指针,但是和其他协同程序共享全局变量等很多信息。线程和协同程序的主要不同在于:在多处理器情况下,从概念上来讲多线程程序同时运行多个线程;而协同程序是通过协作来完成,在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会被挂起。协同是非常强大的功...原创 2020-02-16 03:05:25 · 513 阅读 · 0 评论 -
Lua错误处理
错误Errare humanum est(拉丁谚语:犯错是人的本性)。所以我们要尽可能的防止错误的发生,Lua 经常作为扩展语言嵌入在别的应用中,所以不能当错误发生时简单的崩溃或者退出。相反,当错误发生时 Lua 结束当前的 chunk 并返回到应用中。当 Lua 遇到不期望的情况时就会抛出错误,比如:两个非数字进行相加;调用一个非函数的变量;访问表中不存在的值等(可以通过 metatable...原创 2020-02-16 01:11:20 · 2201 阅读 · 0 评论 -
Lua编译与运行
编译·运行虽然我们把 Lua 当作解释型语言,但是 Lua 会首先把代码预编译成中间码然后再执行(很多解释型语言都是这么做的)。在解释型语言中存在编译阶段听起来不合适,然而,解释型语言的特征不在于他们是否被编译,而是编译器是语言运行时的一部分,所以,执行编译产生的中间码速度会更快。我们可以说函数 dofile 的存在就是说明可以将 Lua作为一种解释型语言被调用。前面我们介绍过 dofile,...原创 2020-02-15 21:20:35 · 4506 阅读 · 0 评论 -
Lua迭代器与泛型 for
迭代器与泛型 for在这一章我们讨论为范性 for 写迭代器,我们从一个简单的迭代器开始,然后我们学习如何通过利用范性 for 的强大之处写出更高效的迭代器。迭代器与闭包迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。在 Lua 中我们常常使用函数来描述迭代器,每次调用该函数就返回集合的下一个元素。迭代器需要保留上一次成功调用的状态和下一次成功调用的状态,也就是他知道来自于哪里...原创 2020-02-15 10:25:41 · 258 阅读 · 0 评论 -
Lua函数
函数函数有两种用途:1.完成指定的任务,这种情况下函数作为调用语句使用;2.计算并返回值,这种情况下函数作为赋值语句的表达式使用。语法:function func_name (arguments-list) statements-list; end; 调用函数的时候,如果参数列表为空,必须使用()表明是函数调用。print(8*9, 9/8) a = math.sin(3) +...原创 2020-02-14 16:04:06 · 521 阅读 · 0 评论 -
Lua基本语句
基本语法Lua 像 C 和 PASCAL 几乎支持所有的传统语句:赋值语句、控制结构语句、函数调用等,同时也支持非传统的多变量赋值、局部变量声明。赋值语句赋值是改变一个变量的值和改变表域的最基本的方法。a = "hello" .. "world"t.n = t.n + 1 Lua 可以对多个变量同时赋值,变量列表和值列表的各个元素用逗号分开,赋值语句右边的值会依次赋给左边的变量。a...原创 2020-02-14 11:41:26 · 298 阅读 · 0 评论 -
lua表达式
表达式Lua 中的表达式包括数字常量、字符串常量、变量、一元和二元运算符、函数调用。还可以是非传统的函数定义和表构造。算术运算符二元运算符:+ - * / ^ (加减乘除幂)一元运算符:- (负值)这些运算符的操作数都是实数。关系运算符< > <= >= == ~= 这些操作符返回结果为 false 或者 true;==和~=比较两个值,如果两个值类型不同...原创 2020-02-14 09:33:08 · 480 阅读 · 0 评论 -
lua类型与值
类型与值lua是动态类型的语言,没有类型定义的语法,每个值自带类型信息,有八种基础类型用type函数可以返回值类型名称nil(空)nil表示空主要功能是用nil区别于其他正常的返回值boolean(布尔)boolean有两个值:true和falseboolean不是条件值的唯一表达方式在lua中任何值都可以表示一个条件,将none和nil视为假,除此之外的值都视为真。不同于其他...原创 2020-02-14 08:11:56 · 429 阅读 · 0 评论 -
Lua基本知识
程序块(chunk)在lua语句之间可以使用也可以不使用分隔符,换行是不起作用的以下语句在lua中均是合法的:在交互模式下运行lua:以dofile方式运行程序块:词法规范Lua中的标识符可以是由任意字母,数字和下划线构成的字符串,但不能以数字开头。应该避免使用以一个下划线开头并跟着一个或多个大写字母(VERSION)的标识符,Lua将这类标识符保留用作特殊用途。Lua中的...原创 2020-02-14 02:09:55 · 460 阅读 · 0 评论 -
Lua的安装与使用
下载和安装luahttp://code.google.com/p/luaforwindowshttp://www.lua.org/download.html使用Lua三种方法命令行记事本SciTe原创 2020-02-14 00:28:39 · 243 阅读 · 0 评论