在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
这里只介绍和插件编写比较有关的几个函数. 详细的Lua手册请参照Lua Reference Manual 5.1. assert(value) - 检查一个值是否为非nil, 若不是则(如果在wow.exe打开调试命令)显示对话框以及输出错误调试信息 collectgarbage() - 垃圾收集器. (新增于1.10.1) date(format, time) - 返回当前用户机器上的时间. error("error message",level) - 发生错误时,输出一条定义的错误信息.使用pcall() (见下面)捕捉错误. gcinfo() - 返回使用中插件内存的占用量(kb)以及当前垃圾收集器的使用量(kB). getfenv(function or integer) - 返回此表已获取函数的堆栈结构或者堆栈等级 getmetatable(obj, mtable) - 获取当前的元表或者用户数据对象. loadstring("Lua code") - 分析字符串中的lua代码块并且将结果作为一个函数返回 next(table, index) - 返回下一个key,一对表值.允许遍历整个表 pcall(func, arg1, arg2, ...) - 受保护调用. 执行函数内容,同时捕获所有的异常和错误. select(index, list) - 返回选择此列表中的商品数值.或者是此件物品在列表中的索引值 setfenv(function or integer, table) - 设置此表已获取函数的堆栈结构或者堆栈等级 setmetatable(obj, mtable) - 设置当前表的元表或者用户数据对象 time(table) - 返回从一个unix时间值 type(var) - 判断当前变量的类型, "number", "string", "table", "function" 或者 "userdata". unpack(table) - 解压一个表.返回当前表中的所有值. xpcall(func, err) - 返回一个布尔值指示成功执行的函数以及调用失败的错误信息.另外运行函数或者错误的返回值
table函数库 一部分的table函数只对其数组部分产生影响, 而另一部分则对整个table均产生影响. 下面会分开说明.
concat是concatenate(连锁, 连接)的缩写. table.concat()函数列出参数中指定table的数组部分从start位置到end位置的所有元素, 元素间以指定的分隔符(sep)隔开. 除了table外, 其他的参数都不是必须的, 分隔符的默认值是空字符, start的默认值是1, end的默认值是数组部分的总长. sep, start, end这三个参数是顺序读入的, 所以虽然它们都不是必须参数, 但如果要指定靠后的参数, 必须同时指定前面的参数. > tbl = {"alpha", "beta", "gamma"}
table.insert()函数在table的数组部分指定位置(pos)插入值为value的一个元素. pos参数可选, 默认为数组部分末尾. > tbl = {"alpha", "beta", "gamma"}
table.maxn()函数返回指定table中所有正数key值中最大的key值. 如果不存在key值为正数的元素, 则返回0. 此函数不限于table的数组部分. > tbl = {[1] = "a", [2] = "b", [3] = "c", [26] = "z"}
table.remove()函数删除并返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起.
table.sort()函数对给定的table进行升序排序. > tbl = {"alpha", "beta", "gamma", "delta"} comp是一个可选的参数, 此参数是一个外部函数, 可以用来自定义sort函数的排序标准. 此函数应满足以下条件: 接受两个参数(依次为a, b), 并返回一个布尔型的值, 当a应该排在b前面时, 返回true, 反之返回false. 例如, 当我们需要降序排序时, 可以这样写: > sortFunc = function(a, b) return b < a end 用类似的原理还可以写出更加复杂的排序函数. 例如, 有一个table存有工会三名成员的姓名及等级信息: guild = {}
可以写出这样的排序函数: function sortLevelNameAsc(a, b) 测试功能如下: > table.sort(guild, sortLevelNameAsc)
数学函数库 以下是一些常用的Lua标准库的数学成员, 按字母顺序排列. 函数 功能 math.abs(x) 返回x的绝对值
字符串函数库 以下是一些常用的Lua标准库的字符串工具: 函数 功能 string.len(s) 返回s的长度 format(formatstring[, value[, ...]]) - 格式化字符串 gsub(string,pattern,replacement[, limitCount]) - 全局替换 strbyte(string[, index]) - 转换字符串为整数值(可以指定某个字符). strchar(asciiCode[, ...]) - 转换整数为相对应的字符 strfind(string, pattern[, initpos[, plain]]) - 在一个指定的目标字符串中搜索指定的内容(第三个参数为索引),返回其具体位置. strlen(string) - 返回当前字符串的字符数 strlower(string) - 将字符串的字母转换为小写格式 strmatch(string, pattern[, initpos]) - 与strfind不同的是,macth返回的是具体值,而find返回的是此值的位置 strrep(seed,count) - 返回一个字符串种子副本的个数 strsub(string, index[, endIndex]) - 返回字符串指定位置的值. strupper(string) - 将字符串的字母转为大写格式 tonumber(arg[, base]) - 若参数能转为数字则返回一个数值.可以指定转换的类型.默认为十进制整数 tostring(arg) - 转换参数为字符串 字符串格式化 Lua提供了string.format()函数来生成具有特定格式的字符串, 函数的第一个参数是格式(formatstring), 之后是对应格式中每个代号的各种数据. 由于格式字符串的存在, 使得产生的长字符串可读性大大提高了. 这个函数的格式很像C语言中的printf(). 格式字符串可能包含以下的转义码: %c - 接受一个数字, 并将其转化为ASCII码表中对应的字符 为进一步细化格式, 可以在%号后添加参数. 参数将以如下的顺序读入: (1) 符号: 一个+号表示其后的数字转义符将让正数显示正号. 默认情况下只有负数显示符号. 在这些参数的后面则是上述所列的转义码类型(c, d, i, f, ...). 以下是一些例子: string.format("%%c: %c", 83) 输出S 在魔兽世界中还有另一个string.format()参数, 允许不按后面的列出顺序读取参数. 在这种情况下, 使用参数的排位+$符号来指定特定的参数. 例如: > print(string.format("%2$d, %1$d, %d", 13, 17)) 如果设定了$参数, 其必须紧接在%符号之后, 并且所有的后续参数(在这里指13, 17)都必须被访问; 换言之如果有3个参数, 不能只使用1$和3$. 可以混用含有$和不含$的转义符; 不含$的转义符将自动从参数列表的头部开始获取数据. $参数在实现本地化中非常方便. 在不同的语言中, 特定的名词可能会以不同顺序出现. 使用带有$参数的格式字符串, 可以使不同语言版本的客户端共用相同的参数列表. 例如下面这句游戏提示: Cladhaire's Shadow Word: Pain is removed. 在德语版客户端中是这样写的: 'Shadow Word: Pain' von Cladhaire wurde entfernt. 在英文版中技能(暗言术·痛)出现在角色名称(Cladhaire)之后, 但在德语版中顺序正相反. 如果参数列表中角色名称是排在技能名称之前, 可以为不同的客户端分别写出如下的格式字符串: 英文版: %s's %s is removed. 这样只要向string.format()传入不同的格式字符串即可, 不需重写具有不同参数次序的语句.
字符串配对 书写插件经常会遇到的一个问题是: 如何处理游戏提供的文本并从中配对获取所需的信息. Lua提供了一系列的函数, 这些函数可以根据给定的配对表达式, 和给定的字符串配对, 并处理成功配对的部分. 配对表达式支持以下的字符类: 单个字符(除^$()%.[]*+-?外): 与该字符自身配对 (还有一个转义码是%f. %f被称作Frontier Pattern, 因为一些原因没有被写入Lua的标准文档中. 有兴趣的朋友可以看lua-users wiki: Frontier Pattern) 当上述的字符类用大写书写时, 表示与非此字符类的任何字符配对. 例如, %S表示与任何非空白字符配对. 配对表达式是由上述字符类代号加上特定选项构成的, 这些特定选项包括: 不加任何选项(例如"%a"): 与单个该类字符配对 配对表达式还可包含以下两个成员: %bxy: 其中x, y是字符. 与x开始, y结束, 并且x, y在字符串中平衡配对的字符串配对. 例如: 给定字串"abc ABC 123 !@# \n \000 %" 配对表达式 配对结果 %a a b c A B C 在配对表达式中还可以添加锚点和捕获标记. 锚点包括^和$符号, ^表示字符串起始处, $表示字符串结束处. 例如^MYADDON:.+表示以MYADDON:开头的字符串. 出现在配对表达式中的成对的圆括号表示捕获(capture)标记. 每一对圆括号中的表达式成功配对的字符串都会被保存下来, 并且可以用%n获取(参见前文). 由于圆括号可以嵌套, 因此圆括号的编号顺序是以左括号为准的, 按左括号的出现先后顺序编号. 例如配对表达式"(a*(.)%w(%s*))"中, a*(.)%w(%s*)会被存为1号捕捉结果, .和%s*则分别是2号、3号捕捉结果. 以下是一些混合应用各种配对表达式成员的例子: 表达式 配对结果 %S+ 与原字串所有非空白成员配对(即被空格隔开的每个部分) 利用配对表达式的主要有以下几个函数: string.gmatch(str, pattern), string.gsub(str, pattern, repl, n), string.match(str, pattern, init), string.find(str, pattern, init, plain). 为简化书写, 也可以用之前在Lua的面向对象提过的方式直接通过字串自身调用这些函数(e.g. str:gmatch(pattern)). string.gmatch(str, pattern) 之前已经提过了, 这是一个返回迭代器的函数. 实际的用例如下: s = "hello world from Lua" 这里是一个捕获并将配对字符分别存到不同变量的例子: t = {}
string.gsub()函数根据给定的配对表达式对源字符串str进行配对, 同时返回源字符串的一个副本, 该副本中成功配对的所有子字符串都将被替换. 函数还将返回成功配对的次数. 实际的替换行为由repl参数的类型决定: 当repl为字符串时, 所有成功配对的子字符串均会被替换成指定的repl字串. n参数可选, 当它被指定时, string.gsub()函数只对源字符串中的前n个成功配对的成员进行操作. 以下是几个例子: > print(string.gsub("hello world", "(%w+)", "%1 %1")) > print(string.gsub("hello Lua", "(%w+)%s*(&w+)", "%2 %1")) > string.gsub("hello world", "%w+", print) > lookupTable = {["hello"] = "hola", ["world"] = "mundo"}
string.match()只寻找源字串str中的第一个配对. 参数init可选, 指定搜寻过程的起点, 默认为1. 在成功配对时, 函数将返回配对表达式中的所有捕获结果; 如果没有设置捕获标记, 则返回整个配对字符串. 当没有成功的配对时, 返回nil.
string.find()寻找源字串str中的第一个成功的配对, 并返回配对子字符串的起点和终点位置. 若没有成功的配对, 则返回nil. 参数init可选, 指定搜寻过程的起点, 默认为1, 可以是负数; plain参数可选, 是个布尔值, 默认为false, 如果指定为true, 则pattern被视作普通字串(plain string), 在进行查找时, 所有其中的转义符和功能文字全部视作普通文本. 注意如果指定plain, 也必须同时指定init. 如果在配对表达式中设置了捕获标记, 函数将在返回两个位置数值后继续返回捕获结果.
魔兽世界对Lua新增的函数 以下函数是魔兽世界的插件界面额外增加的. 普通的Lua编译器可能不支持这些函数. strsplit(sep, str) strsplit()函数按给定的分隔符sep分割源字符串str并依序返回分割所得的每个部分. 等同于string.split(sep, str). > print(strsplit(":", "foo:bar:blah")) strjoin(sep, ...) strjoin()函数将后续参数列表的所有字串依次连接起来, 并以分隔符sep两两隔开. 等同于string.join(sep, ...). > print(strjoin(" ", "This", "is", "a", "string")) strconcat(...) strconcat()连接参数列表中的所有字符串, 并返回连接结果. 等同于string.concat(...). > print(strconcat("This", "is", "a", "string")) getglobal(name) 获取名字为name的全局变量的值并返回该值. 在魔兽世界的界面编程中, 广泛地用于处理父框架和子框架共存时的变量问题. setglobal(name, value) 将名为name的全局变量的值设为value. 同样是在默认魔兽界面中被广泛应用的函数. debugstack(start, count1, count2) 调试用函数. 三个参数均是可省略的. start: 指定堆栈深度, 追踪过程将从这里开始(默认为1) 此函数只能在魔兽世界中正常工作. 普通的Lua中有其他用于追踪堆栈内容的方法.
函数别名 在WoW中, 大量常用的库函数均拥有别名, 以简化书写. 以下是所有别名及其对应的函数 别名 函数 别名 函数 abs math.abs tan math.tan
表函数 也知道, 很多表都被设计为只有数字索引, 开始于1并且没有结尾(如like {[1] = "foo", [3] = "bar"} --- [2]是不存在的所以为nil值).工作时,与任何其他表并没有差别,但很可能会产生意想不到的结果. 在编写lua中, 这个也就是通常所说的bug foreach(table,function) - 为表中的每个元素执行函数 foreachi(table,function) - 为表中的每个元素执行函数, 按顺序访问(不推荐, 可以使用ipairs代替) getn(table) - 当作为一个聊表时, 返回当前表的大小. 现在已经废弃了, 你可以直接使用#符号.使用#(table)代替table.getn(table) ipairs(table) - 返回一个迭代型整数遍历表。 pairs(table) - 返回一个迭代遍历表 sort(table[, comp]) - 对一个数组进行排序, 还可以指定一个可选的次序函数 tinsert(table[, pos], value) - 将一个元素插入指定的位置(默认在表的最后) tremove(table[, pos]) - 删除指定位置的元素(默认表最后一个) ------------------------------------------------------------------------------------------------ Lua5.1中数学库的所有函数如下表:
|
请发表评论