lua
文章平均质量分 81
VermillionTear
这个作者很懒,什么都没留下…
展开
-
快速掌握Lua 5.3 —— 让我们开始吧
Q:什么样的文件是Lua脚本? A:存储了使用Lua语言编写的脚本的文件都可以称作Lua脚本,但一般为了一眼就能看出来,将文件的后缀命名为.lua。Q:如何启动Lua? A: 1、命令行中输入lua,这样会启动Lua的“stand-alone interpreter”模式,可以像使用shell一样使用它。 2、将Lua脚本存入“*.lua”文件中,命令行中使用lua *.lua执行脚本。Q:原创 2016-01-12 17:12:52 · 2270 阅读 · 0 评论 -
快速掌握Lua 5.3 —— I/O库 (2)
Q:什么是”Complete Model”? A:所有的文件操作都基于明确指定的文件句柄,可以同时打开多个文件句柄。这就意味着同一时间可以操作多个文件,对于每一个文件读或写均可。文件句柄等同于C语言中的”FILE*”,它代表一个被打开文件的当前读取位置。io.open()可以指定打开的文件,并返回其文件句柄,--[[ io.open(filename [, mode]) 以"m原创 2016-03-04 00:04:16 · 1992 阅读 · 0 评论 -
快速掌握Lua 5.3 —— 字符串库 (2)
Q:模式匹配字符串的相关函数? A:--[[ string.find(s, pattern [, init [, plain]]) 在字符串"s"中查找第一个与匹配模式"pattern"相匹配的子串, 函数返回子串的开始位置和终止位置。如果未找到返回"nil"。 如果在"pattern"中定义了捕获,捕获到的若干值也会在之后依次返回。 "init"原创 2016-02-21 13:53:21 · 2555 阅读 · 0 评论 -
快速掌握Lua 5.3 —— 字符串库 (1)
Q:对字符串操作的基本函数? A:--[[ string.byte(s [, i [, j]]) 依次返回字符串"s"中从"i"到"j"的字符的ASCII码。 "i"默认为1,"j"默认为"i"。"i"或"j"如果为负数,则在字符串"s"中从后往前数。]]print(string.byte("abc")) --> 97print(st原创 2016-02-21 15:35:01 · 4034 阅读 · 0 评论 -
快速掌握Lua 5.3 —— 字符串库 (3)
Q:什么情况下"pattern"会匹配空串?----------------------A:要小心的使用`*`和`-`,因为它们可以匹配零次。```-- 如果你打算用"%a*"匹配单词,你会发现到处都是单词。print(string.find(";$% **#$hello13", "%a*")) --> 1 0print(string.find(";$% **#$hello13", "%a原创 2016-02-21 22:47:31 · 2680 阅读 · 3 评论 -
快速掌握Lua 5.3 —— 扩展你的程序 (1)
Q:如何在C中将Lua作为配置文件语言使用?A:"config.lua"文件中:```-- window sizewidth = 200height = 300```"main.c"文件中:```#include <stdarg.h>#include <stdio.h>#include <stdlib.h>#include <lua.h>原创 2016-03-21 10:26:33 · 1834 阅读 · 0 评论 -
快速掌握Lua 5.3 —— 操作系统库
Q:与文件操作相关的库方法? A:--[[ os.remove(filename) 删除文件名为"filename"的文件,"filename"可以是一个普通文件或是一个空的目录。 如果删除失败,则返回"nil"加上错误描述以及错误码。]]print(os.remove("existent-file")) --> trueprint(os.remove("n原创 2016-03-09 23:55:08 · 2253 阅读 · 0 评论 -
快速掌握Lua 5.3 —— 从Lua中调用C函数
Q:Lua调用C函数的两种方式?A:1、程序主体在C中运行,C函数注册到Lua中。C调用Lua,Lua调用C注册的函数,C得到函数的执行结果。2、程序主体在Lua中运行,C函数作为库函数供Lua使用。第一种方式看起来很罗嗦,也很奇怪。既然程序主体运行在C中,而且最终使用的也是C中定义的函数,那么为何要将函数注册给Lua,然后再通过Lua调用函数呢?原创 2016-04-03 23:09:32 · 22212 阅读 · 4 评论 -
快速掌握Lua 5.3 —— 扩展你的程序 (2)
Q:如何在C中调用Lua的函数? A: 1、将函数名入栈。 2、将参数按照形参的顺序依次入栈。 3、调用函数。此过程会将函数的参数出栈,调用完成后将函数的返回值入栈。 4、获取函数的返回值。 “config.lua”文件中:function f(x, y) return (x ^ 2 * math.sin(y)) / (1 - x)end“main.c”文件中:原创 2016-03-21 13:58:20 · 2250 阅读 · 1 评论 -
快速掌握Lua 5.3 —— Lua与C之间的交互概览
Q:什么是Lua的虚拟栈? A:C与Lua之间通信关键内容在于一个虚拟的栈。几乎所有的调用都是对栈上的值进行操作,所有C与Lua之间的数据交换也都通过这个栈来完成。另外,你也可以使用栈来保存临时变量。虚拟栈由Lua管理。 栈的使用解决了C和Lua之间两个不协调的问题:第一,Lua会自动进行垃圾收集,而C要求显示的分配存储单元,两者引起的矛盾。第二,Lua中的动态类型和C中的静态类型不一致引起的原创 2016-03-17 16:55:56 · 8852 阅读 · 0 评论 -
快速掌握Lua 5.3 —— 编写提供给Lua使用的C库函数的技巧 (1)
Q:如何在C库函数中灵活的操作Lua的”table”?A:--[[ void lua_settable(lua_State *L, int index); 从虚拟栈中"index"处获得"table",栈顶获得"value", 栈顶下面一个元素获得"key"。相当于在Lua环境中执行"table[key] = value"命令, 设置"table[key]"的过程有可能原创 2016-04-11 15:39:52 · 4946 阅读 · 0 评论 -
快速掌握Lua 5.3 —— userdata (1)
Q:什么是"userdata"?A:"userdata"分为两类,"full userdata"和"light userdata"。Lua使用他们来表示C中一些特殊的类型。前面的章节中,我们看到了如何通过C编写新的函数来扩展Lua;使用"userdata",我们将可以通过C编写新的类新来扩展Lua。原创 2016-05-08 10:45:52 · 6137 阅读 · 0 评论 -
快速掌握Lua 5.3 —— userdata (2)
Q:如何使用"userdata"的"metamethods"?A:我们继续来修改上一节中的例子,这次我们的目标是使用面向对象的方式调用"userdata"的方法。这个目标既可以在Lua中实现,也可以在C库中实现,我们先来看一个比较简单的方式,在Lua中实现。"mylib.c"中代码无需更改,只需要修改"a.lua"中的代码,原创 2016-05-08 10:51:45 · 2073 阅读 · 0 评论 -
快速掌握Lua 5.3 —— 调试库 (1)
Q:什么是活动函数?----------A:程序中被调用但还未执行完成的函数。```function g() --[[ 此时函数"g"被调用但还未执行完成,是活动函数。所以这里获取的是函数"g"的信息。 "debug.getinfo(2)"获取的才是函数"f"的信息。]] local x = debug.getinfo(1, "n") for k, v in pairs(x) d原创 2016-05-08 16:39:40 · 2493 阅读 · 0 评论 -
快速掌握Lua 5.3 —— 调试库 (2)
Q:如何调试”Closure”的”upvalue”信息? A:--[[ debug.getupvalue(f, up) 返回函数("Closure")"f"的第"up"个"upvalue"的名字和值。 Lua按照"upvalues"在匿名函数中出现的顺序对其编号。如果指定的"up"索引越界,则返回"nil"。 以'('开头的变量名表示没有名字的变量(比如是循原创 2016-05-08 16:40:50 · 4172 阅读 · 1 评论 -
快速掌握Lua 5.3 —— 编写提供给Lua使用的C库函数的技巧 (2)
Q:什么是”registry”?A:有时候,我们需要在程序中使用一些非局部的变量。在C中我们可以使用全局变量或是静态变量来实现,而在为Lua编写C库的过程中,使用以上类型的变量并不是一个好的方式。首先,这些变量中无法存储Lua的值。其次,这些变量如果在多个Lua状态机中被使用,则很可能造成非预期的结果。 一个替代方案是,将这些值存储在Lua的全局变量中。这种方式解决了上面提到的两个问题,Lua全局原创 2016-04-24 17:23:50 · 4843 阅读 · 0 评论 -
快速掌握Lua 5.3 —— I/O库 (1)
Q:什么是”Simple Model”? A:所有的文件操作都基于一个默认的输入文件和一个默认的输出文件,这就意味着同一时间对于输入和输出来说,只可操作一个文件(默认的文件)。默认的输入文件初始化是stdin,默认的输出文件初始化是stdout,io.input()和io.output()可以更改对应的默认文件,-- "a.lua"文件中:--[[ "io.read()"从"io.in原创 2016-03-01 22:27:30 · 1749 阅读 · 0 评论 -
快速掌握Lua 5.3 —— "table"库
Q:如何向”table”中插入和删除元素?A:之前提到的,向”table”中插入元素使用索引的方式,而删除’table”中的元素则是将其赋为nil。这里介绍的是”table”库中提供的插入与删除函数,--[[ table.insert(list, [pos,] value) 向表"list"的"pos"位置插入值"value"。 list[pos], list[pos+1], ·原创 2016-02-17 15:25:55 · 2486 阅读 · 0 评论 -
快速掌握Lua 5.3 —— 各种变量和值
Q:Lua的基本变量类型? A: nil, boolean, number, string, userdata, function, thread, and table.type()可以获取一个变量的类型,print(type("Hello world")) --> stringprint(type(10.4*3)) --> numberprint(typ原创 2016-01-17 12:51:14 · 1876 阅读 · 0 评论 -
快速掌握Lua 5.3 —— 各种运算符以及各种声明
Q:Lua中有哪些运算符? A: 1、算数运算符:加+,减-,乘*,除/,负-,乘方^。 2、关系运算符:小于<、大于>、小于等于<=、大于等于>=、等于==、不等于~=。 3、逻辑运算符:并且and,或or,非not。 4、字符串连接符..。Q:Lua中的逻辑运算符与C语言中的有何不同? A:C语言中的&&和||中所有表达式都可以作为判断条件,并且最终返回的值一定是true或者fals原创 2016-01-13 13:34:15 · 5193 阅读 · 0 评论 -
快速掌握Lua 5.3 —— 函数
Q:Lua中如何定义以及调用函数? A:function foo(arg1, arg2, ...) dosomething return ret1, ret2, ... or nothingend-- add all elements of array 'a'.function add (a) local sum = 0 for i,v in ipairs(a) do原创 2016-01-16 00:57:51 · 1976 阅读 · 3 评论 -
快速掌握Lua 5.3 —— "Iterators"和"Generic for"
Q:什么是"iterator"?A:一种允许你访问一个集合中的元素的构造。在Lua中用函数来表示"iterator",每次调用这个函数,函数就返回集合中的下一个元素。Q:如何创建以及使用"iterator"。A:使用"Closure"就可以创建"iterator"。原创 2016-01-16 02:56:22 · 1077 阅读 · 0 评论 -
快速掌握Lua 5.3 —— Coroutines
Q:什么是”Coroutine”?A:有些类似与多线程,但他们之间也有区别, 1、从概念上来看,多线程是同一时间所有的线程同时都在运行。而一组”Coroutines”在同一时间只有一个”Coroutine”在运行。 2、从应用场景来看,多线程一般起到分流的作用,每个线程专注做自己的事情,线程之间合作的关系较弱。而一组”Coroutines”之间合作的关系就比较强,他们都是在做一件事情,他们原创 2016-01-21 13:28:36 · 2810 阅读 · 1 评论 -
快速掌握Lua 5.3 —— 两个完整的例子
第一个例子将Lua脚本作为一个小型的简化版的“数据库”,展现了如何简单高效的将这个“数据库”中的数据转化为网页显示。-- "db.lua"文件中内容。--[[ 这里看似是一张名为"entry"的表中存储了许多数据, 实际上在转化程序中这时一个名为"entry"的函数, 参数是下面这个存储了许多数据的"table"。 还记得"foo({})"与"foo{}"等同吗?]]原创 2016-01-21 16:51:32 · 4906 阅读 · 0 评论 -
快速掌握Lua 5.3 —— 数据结构
Q:如何使用”table”创建一维数组? A:-- 使用构造的方式。squares = {1, 4, 9, 16, 25, 36, 49, 64, 81}-- 使用"for"循环 + 连续的索引。a = {} -- new arrayfor i=1, 1000 do a[i] = 0end-- 当然,连续的索引非必须都是正数。a = {}for i=-5, 5原创 2016-01-23 23:45:31 · 1494 阅读 · 0 评论 -
快速掌握Lua 5.3 —— 数据操作
Q:如何利用Lua构造器操作数据?A:将每条数据作为Lua中的一个”table”构造,将数据中的每一个域作为”table”中的每一个”value”。比如下面这些数据, Donald E. Knuth,Literate Programming,CSLI,1992 Jon Bentley,More Programming Pearls,Addison-Wesley,1990在Lua中原创 2016-01-27 12:16:13 · 1429 阅读 · 0 评论 -
快速掌握Lua 5.3 —— "metatables" and "metamethods" (1)
Q:什么是”metatable”? A:”metatable”是一张定义了一些特殊功能的”table”,当他被分配给某个”table”(另一个”table”,与”metatable”不是同一个”table”)时,这个”table”就具有了这些特殊功能。 通常在Lua中对”table”的操作是:插入一个”key-value”对,通过”key”查找”value”,遍历所有的”key-value”对原创 2016-01-28 19:55:07 · 1861 阅读 · 0 评论 -
快速掌握Lua 5.3 —— 环境
Q:_G? A:_G是一个普通的”table”,它其中存储了当前运行环境中所有的全局变量。type(_G) --> tablefor n in pairs(_G) do print(n) end -- 打印当前运行环境中所有全局变量。我们平常在程序中所写的全局变量就存储在其中,全局变量名是”key”,全局变量值是”value”,a = 10print(_G["a"])原创 2016-02-05 17:12:23 · 3353 阅读 · 0 评论 -
快速掌握Lua 5.3 —— "metatables" and "metamethods" (2)
Q:如何定义访问"table"相关的"metamethods"?A:访问"table"相关的"metamethods"有两个,`__index`和`__newindex`。1、之前说过,当访问一个"table"中不存在的域时,返回结果是`nil`。这是正确的,但并不是完全正确。实际上当这种情况发生时,Lua会试图寻找对象的"metatable"中名原创 2016-01-29 13:28:58 · 1265 阅读 · 1 评论 -
快速掌握Lua 5.3 —— packages
Q:Lua如何管理”package”? A:Lua使用”table”来表示”package”,就像Lua标准库的做法一样。我们也可以使用”table”来创建自己的”package”。-- "complex.lua"文件中,一个实现对复数运算的"package"。complex = {}-- 用一个"table"表示一个复数,"r"是实部,"i"是虚部。function compl原创 2016-02-09 00:14:53 · 1104 阅读 · 0 评论 -
快速掌握Lua 5.3 —— 编译,运行以及错误
Q:dofile()与loadfile()的区别? A: 1、-- "a.lua"文件中的内容。--print("Hello Lua!")-------------------------- loadfile()编译"a.lua"中的代码,并将代码以一个函数的形式返回。f = loadfile("a.lua")f() --> Hello Lua!-- dofile()原创 2016-01-19 01:18:43 · 3302 阅读 · 0 评论 -
快速掌握Lua 5.3 —— 面向对象编程
Q:如何在Lua中定义对象的方法以及调用对象的方法? A:面向对象的特殊性在于它以this指针的方式传递了对象本身,并且这种操作是隐藏起来的。 在Lua中使用:实现面向对象方式的调用。:只是一个语法糖,它同时在方法的声明与实现中增加一个名为self的隐藏参数(对象本身)。Account = {balance = 1000} -- 账户余额初始为1000。--[[ 取钱。原创 2016-02-13 22:03:50 · 5197 阅读 · 0 评论 -
快速掌握Lua 5.3 —— "Weak Tables"以及数学库
Q:“引用”和“引用计数”?--------------A:“引用”既为对象的名字。比如`a = {}`,名叫`a`的变量存储的值是一个"table","table"的名字是`a`;同时还可以说变量`a`存储着"table"的“引用”。当“(强)引用”被创建时,对象的“引用计数”加1,只要对象的“引用计数”不为0,对象就不会被销毁,Lua的“垃圾回收系统”只回收那些“引用计数”为0的对象。原创 2016-02-15 11:26:56 · 2007 阅读 · 0 评论 -
快速掌握Lua 5.3 —— 资源管理
Q:Lua的”finalizer”? A:在我们之前看到的使用”userdata”的例子中,我们只关心如何创建并使用”userdata”,从未关心何时以及如何释放我们创建的”userdata”,因为这些事都由Lua的垃圾回收器帮我们处理。然而很多时候,程序并不会这么简单,有可能在其中还会涉及到文件句柄,窗口句柄等,此时这些资源就需要创建者进行管理。 一些面向对象语言提供了析够器用来帮助用户管理原创 2016-05-22 21:21:57 · 5335 阅读 · 0 评论