D.H.Q的烂笔头

Just code for fun~

Archive for 5, 2013

Lua 学习笔记(10) -- 字符串库

Lua 最强大的特性之一就是它的字符串处理能力,它支持字符格式化输出,具有可扩展的模式匹配查找功能,以及一些实用的字符操作,例如查询、截取、替换和删除等字符串操作,这些字符串操作函数都封装在一个名为 string 的模块里。

Lua 里的字符索引是从 1 开始,索引值也可以是负数,这种情况将被解释成向后索引,从字符串末尾开始算起。

下面是 Lua 5.2 提供的字符串操作函数:

byte

函数 string.byte 把字符串里的第 i 个字符转为 ASCII 编码,默认是输出第一个字符的编码(只有一个参数的话),用法:

string.byte (s [, i [, j]])

例子:

print(string.byte("abc"))
print(string.byte("abc", 2))

继续阅读 »

Lua 学习笔记(9) -- Lua 与 C 间的交互

Lua 是一门轻巧、灵活、扩展性很强的脚本语言,它可以很容易的嵌入到其他语言(C/C++)中使用,这主要得益于其提供了功能强大的 C API,这让其跟 C/C++ 间的互调成为一件很轻松的事。

Lua 调用 C

Lua 调用 C 函数,其实就是把 C 函数注册到 Lua 中去,把 C 函数地址传递给 Lua 解释器。这个传递是要遵循一个的协议的,即:

typedef int (*lua_CFunction)(lua_State* L)

Lua 和 C 是通过栈(State)来交互的,Lua 调用 C 函数时,首先 Lua 把数据拷贝到栈上,然后 C 从栈上获取数据,调用结束后将返回结果放到栈中。栈中的每个数据通过索引值进行定位,索引值为正时表示相对于栈底的偏移索引,索引值为负时表示相对于栈顶的偏移索引,索引值以1或-1为起始值,因此栈顶索引值永远为-1 ,栈底索引值永远为1 。栈相当于数据在 Lua 和 C 之间的中转站,每一个 C 函数都有自己的独立的私有栈。

继续阅读 »

Lua 学习笔记(8) -- 闭包

之前介绍 Lua 的数据类型时,也提到过,Lua 的函数是一种“第一类值(First-Class Value)”。它可以:

存储在变量或 table (例如模块面向对象的实现)里

t = { p = print }
t.p("just a test!")

作为实参(也称其为“高阶函数(higher-order function)”)传递给其他函数调用

t = {2, 3, 1, 5, 4}
table.sort(t, function(a, b) return (a > b) end)

作为其他函数的返回值

function fun1(x) return fun2(x) end

继续阅读 »

Lua 学习笔记(7) -- 面向对象编程

其实 Lua 中的 table 是一种对象,因为它跟对象一样,有其自己的操作方法:

Role = { hp = 100 }
function Role.addHp(hp)
    Role.hp = Role.hp + hp
end

Role.addHp(50)
print(Role.hp)

上面代码创建了一个名为 Role 对象,并有一个 addHp 的方法,执行 "Role.addHp" 便可调用 addHp 方法。

不过上面对象 Role 是以全局变量的方式创建,会有一种“全局污染”的威胁,即变量 Role 在其他地方被重新赋值(例如被赋成 nil),对象里的属性或方法可能会面临被销毁或不能正常工作的情况。

对于这种问题,Lua 提供一种“接受者”的解决方法,即额外添加一个参数 self 来表示对象本身:

继续阅读 »

Lua 学习笔记(6) -- 元表和元方法

元表(metatable)是 Lua 里每种类型的值的默认操作方式的集合,例如,数字可以加减乘除、字符串可以连接合并、table 可以插入一对 key-value 值、函数可以被调用等等,这些操作都遵循其预定义的行为来执行。

而值的默认操作方式不是一成不变的,可以通过元表来修改其行为表现,或者是新定义一些默认没有的操作。例如,当两个 table 相加时, Lua 会检查它们之间的元表里是否有 "__add" 这个函数,如果定义有这个函数, 则调用这个函数来执行一次加法操作。

这里,相加这个操作的函数名 -- "__add" 是元表的键名(元表的键名也称之为事件(event),一般以 2 个下划线 "_" 开头),而 "__add" 函数则是这个相加操作的元方法(metamethod)。对于值的操作,Lua 都将其关联上一个被称作事件的指定健,当 Lua 需要对一个值发起这些操作中的一个时, 它会去检查值的元表里是否有对应事件。如果有,则键名对应的值(元方法)将控制 Lua 怎样去执行这个操作。

getmetatable - 获取元表

继续阅读 »
返回顶部