由于lua中没有原生的list对象类型,而只有(无所不能的)table。习惯了python编程的人很可能会觉得不适应。平心而论,Python在这一点上的设计确实更傻瓜化更清晰一点,好用之处体现在两点:
[list]
[*] 直接用[]来生成list对象,在代码中显得很清楚;
[*] 有大量方便好用的函数能操作在list对象上,非常方便;
[/list]
因此,我们希望在lua中,加入对list对象类型的支持。这个目标,在lglib中实现。
全局对象List
lglib中,定义了一个全局对象List,它就是所有list实例的原型。使用require 'lglib'后,这个对象可以直接使用。此对象又继承自lua的原生table结构。
生成一个新的list
判断一个对象是否是一个list
产生一个序列list
当使用全局对象List创建了list实例后,这些实例可以使用下面的api
添加元素
删除元素
扩展list
[color=brown]注:此合并运算也可以由 a = a + b 的形式来完成。[/color]
查找
包含
计算同值元素出现次数
转成字符串
排序
翻转
切片
清空
求长度
删除一个区间
将一个列表插入到本表中来
[list]
[*] 直接用[]来生成list对象,在代码中显得很清楚;
[*] 有大量方便好用的函数能操作在list对象上,非常方便;
[/list]
因此,我们希望在lua中,加入对list对象类型的支持。这个目标,在lglib中实现。
全局对象List
lglib中,定义了一个全局对象List,它就是所有list实例的原型。使用require 'lglib'后,这个对象可以直接使用。此对象又继承自lua的原生table结构。
生成一个新的list
local lista = List()
local listb = List {1,2,3,4,5,6}
判断一个对象是否是一个list
isList(t)
产生一个序列list
List.range(start, finish)
start: 序列的起始值
finish: 序列的结束值
示例:
local a = List.range(1, 5) --> {1,2,3,4,5}
local a = List.range(5) --> {1,2,3,4,5}
local a = List.range(5, 10) --> {5,6,7,8,9,10}
当使用全局对象List创建了list实例后,这些实例可以使用下面的api
添加元素
list_obj:append(elem) 将新元素elem添加到列表末尾
list_obj:prepend(elem) 将新元素elem添加到列表头部
list_obj:push(elem) 将新元素elem添加到列表末尾
list_obj:insert([pos,] elem) 将新元素插入到列表的某一个位置
删除元素
list_obj:pop() 弹出列表最后一个元素,并返回此元素(此函数不是返回list_obj对象本身)
list_obj:iremove(i) 按下标索引删除第i个元素,返回list_obj对象本身
list_obj:remove(elem) 按值删除元素elem,返回list_obj对象本身
扩展list
list_obj:extends(another) 把list another与list list_obj拼接起来,仍然由list_obj进行索引
another: 另外一个list
示例:
local a = List {1,2,3} --> a = {1,2,3}
local b = List {4,5,6} --> b = {4,5,6}
a:extends(b) --> a = {1,2,3,4,5,6}
[color=brown]注:此合并运算也可以由 a = a + b 的形式来完成。[/color]
查找
list_obj:find(val[, idx]) 在list_obj中从第idx个索引起开始查找值为val的元素,返回此元素的索引
示例:
local a = List {1,2,3,7,8,9} --> a = {1,2,3,7,8,9}
a:find(7) --> 4
包含
list_obj:contains(elem) 判断元素是否在list_obj中,返回true或false
计算同值元素出现次数
list_obj:count(elem) 计算元素elem在list_obj中出现的次数
转成字符串
list_obj:join(sep) 将列表的各元素以sep为间隔符合并成一个字符串,返回合并后的字符串
排序
list_obj:sort(cmp) 将本列表按传入的比较函数cmp进行排序,返回自身
翻转
list_obj:reverse() 将本列表的各元素的顺序前后翻转,返回自身
切片
list_obj:slice(start, stop, is_rev) 将本列表的各元素的顺序前后翻转,返回自身
清空
list_obj:clear() 将本列表清空(暂时不知道什么场合下会用到它)
求长度
list_obj:len() 求本列表长度
删除一个区间
list_obj:chop(i1,i2) 删除本列表中索引从i1开始到i2结束的一段,返回自身
将一个列表插入到本表中来
list_obj:splice(idx, list) 将列表list中的所有元素依次插入到本列表从idx索引开始的地方