D.H.Q的烂笔头

Just code for fun~

Archive for 5, 2013

Lua 学习笔记(5) -- table

table 在 Lua 里是一种重要的数据结构,它可以说是其他数据结构的基础,通常的数组、记录、线性表、队列、集合等数据结构都可以用 table 来表示,甚至连全局变量(_G)、模块、元表(metatable)等这些重要的 Lua 元素都是 table 的结构。可以说,table  是一个强大而又神奇的东西。

table 特性

在之前介绍 Lua 数据类型时,也说过了 table 的一些特性,简单列举如下(详情可查看之前的介绍):

  • table是一个“关联数组”,数组的索引可以是数字或者是字符串
  • table 的默认初始索引一般以 1 开始
  • table 的变量只是一个地址引用,对 table 的操作不会产生数据影响
  • table 不会固定长度大小,有新数据插入时长度会自动增长

继续阅读 »

小试 LuaSocket

LuaSocket 是 Lua 的网络模块库,它可以很方便地提供 TCPUDPDNSFTPHTTPSMTPMIME 等多种网络协议的访问操作。它由两部分组成:一部分是用 C 写的核心,提供对 TCP 和 UDP 传输层的访问支持。另外一部分是用 Lua 写的,负责应用功能的网络接口处理。

安装 LuaSocket

如果你安装有 Lua 模块的安装和部署工具 -- LuaRocks,那么一条指令就能安装部署好 LuaSocket:

luarocks install luasocket

继续阅读 »

Lua 的模块安装和部署工具 - LuaRocks

Lua 是一个短小精悍的脚本语言,很多功能官方都不内置支持,需要添加第三方模块库来支持。但是,这些第三方模块是由不同开发者制作,分散的放在不同地方,如果想要安装一个模块还要到处去找,况且下载完模块后,有时还需要手动编译,设置环境变量,把模块放到指定的 Lua 模块加载目录。反正,安装一个第三方 Lua 模块需要执行上述一连串操作,也是一个繁琐的过程。

对于这些繁琐,LuaRocks 可以简化以上安装 Lua 模块的操作。 LuaRocks 是 Lua 模块的安装和部署工具,类似于 RubygemPythoneggPerlcpan,它可以很方便的安装第三方 Lua 模块,而且你不需要关心模块之间的依赖关系,一条命令就可以很轻松地把模块安装部署好,省心,省力,不用去折腾安装 Lua 模块的细节。

安装 LuaRocks

喜闻乐见的是,Mac 下的 Homebrew 居然内置了 LuaRocks 的安装包(之前安装 Lua,用 "brew search lua" 搜 Lua 安装包时无意间发现),因此,在 Mac 下安装 LuaRocks 很简单,一条指令就行:

brew install luarocks -v

继续阅读 »

Lua 学习笔记(4) -- 模块与包

从 Lua 5.1 开始,Lua 加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。

创建模块

其实 Lua 的模块是由变量、函数等已知元素组成的 table,因此创建一个模块很简单,就是创建一个 table,然后把需要导出的常量、函数放入其中,最后返回这个 table 就行。格式如下:

-- 定义一个名为 module 的模块
module = {}

-- 定义一个常量
module.constant = "this is a constant"

-- 定义一个函数
function module.func1()
    io.write("this is a public function!\n")
end

local function func2()
    print("this is a private function!")
end

function module.func3()
    func2()
end

return module

继续阅读 »

Lua 学习笔记(3) -- 协同程序(coroutine)

协同程序(coroutine,这里简称协程)是一种类似于线程(thread)的东西,它拥有自己独立的栈、局部变量和指令指针,可以跟其他协程共享全局变量和其他一些数据,并且具有一种挂起(yield)中断协程主函数运行,下一次激活恢复协程会在上一次中断的地方继续执行(resume)协程主函数的控制机制。

Lua 把关于协程的所有函数放在一个名为 “coroutine” 的 table 里,coroutine 里具有以下几个内置函数:

-coroutine-yield [function: builtin#34]
|         -wrap [function: builtin#37]
|         -status [function: builtin#31]
|         -resume [function: builtin#35]
|         -running [function: builtin#32]
|         -create [function: builtin#33]

coroutine.create - 创建协程

函数 coroutine.create 用于创建一个新的协程,它只有一个以函数形式传入的参数,该函数是协程的主函数,它的代码是协程所需执行的内容

co = coroutine.create(function() 
    io.write("coroutine create!\n") 
end)
print(co)

当创建完一个协程后,会返回一个类型为 thread 的对象,但并不会马上启动运行协程主函数,协程的初始状态是处于挂起状态

coroutine.status - 查看协程状态

协程有 4 种状态,分别是:挂起(suspended)、运行(running)、死亡(dead)和正常(normal),可以通过 coroutine.status 来输出查看协程当前的状态。

print(coroutine.status(co))

继续阅读 »
返回顶部