List和Dictionary是VimScript中的重要数据类型。本节来介绍操纵List数据类型的内置函数。
(1)get( {list}, {idx} [, {default}] )
返回list的第idx个元素。需要注意的是,即使索引值idx超出了有效范围,该函数仍然会返回一个值,这个值或者是0,或者是给定的default参数。
(2)len ( {expr} )
返回数组的长度。
(3)empty( {expr} )
判断一个数组是否为空,等同于 return len( {expr}) == 0,但是效率比len()高。
(4)insert( {list}, {item [, {idx} ])
在数组中插入一个元素,位于idx之前。如果idx=0或者不提供idx参数,就插入在开头。返回结果数组的引用。
(5)add( {list}, {expr})
在数组末尾增加一个元素。返回结果数组的引用。
(6)extend( {expr}, {expr2} )
把第二个数组中的元素加入第一个数组中,返回结果数组的引用。
(7)remove( {list}, {idx} [, {end] )
删除数组中的一个或多个元素。
以上都是对于集合类数据类型的基本操作。测试代码如下:
let list = [1,2,3] let e = get(list, 2) echo e unlet e let e = get(list, 3) " 索引不在范围,也不报错 echo e " echo list[3] 索引不在范围会报错 unlet e let e = get(list, 3, 99) echo e let len = len(list) echo len echo empty(list) echo empty([]) call insert(list, 0) call add(list, 4) echo list call add(list, [1,2,3,4]) call extend(list, [11,12,13]) echo list call remove(list, 2) echo list call remove(list, 2, len(list)-1) echo list
(8)copy( {expr} )
返回给定数组的浅拷贝。所有涉及引用类型的复制操作都会涉及到深浅拷贝的问题。
(9)deepcopy( {expr} [, {noref} ] )
返回给定数组的深拷贝。如果有交叉循环引用,可能会导致深拷贝出错。尽量少使用深拷贝。
测试代码:
let sublist = ['hello'] let list = [1,2,3,sublist,5] " let list2 = copy(list) let list2 = deepcopy(list) echo list let list2[3][0] = 99 echo list2 echo list
(10)filter( {expr}, {string} )
删除不满足要求的元素,string用于描述过滤规则。
(11)map ( {expr}, {string} )
修改数组的每一个元素,修改规则在string中描述。
测试代码:
let list = [1, 2, 3, 4, 5, 6] call filter(list, 'v:val >= 3') " 删除所有小于3的元素 echo list call map(list, '"<" . v:val . ">"') " 为每个元素添加修饰 echo list
[3, 4, 5, 6] ['<3>', '<4>', '<5>', '<6>']
(12)sort ({list} [, {func})
按照指定的规则对数组排序。
(13)reverse ({list})
反序数组中的元素。
示例代码:
let list = [23, 33, 2 ] call sort(list) echo list call reverse(list) echo list ~
(14)split( {expr} [, {pattern} [, {keepempty}]] )
把一个字符串按照特定的边界标记进行分割,返回各个部分为元素的数组。
(15)join ({list} [, {sep}])
与split()正好相反,把一个数组中的各个元素的字符串描述连接成一个大字符串返回。
示例代码:
let str = "I am a good boy" let parts = split(str) echo parts echo join(parts) ~(16)range( {expr} [, {max} [, {stride}]])
返回一个整数数组,具体还是看例子。
示例代码:
echo range(4) echo range(2,4) echo range(2,9,3) echo range(2,-2,-1) echo range(0) echo range(2,0) " 会出错
[0, 1, 2, 3] [2, 3, 4] [2, 5, 8] [2, 1, 0, -1, -2] [] Error detected while processing /root/t4.vim:
(17)string({expr} )
这个在前面字符串操作函数中已经说过了,string()用于所有数据类型的序列化。当然也包括List。这里有一个知识点,就是VimScript的一个函数的参数可以是不同的数据类型。注意这与C++里的重载不同,因为不存在同名的多个函数,而是只有一个函数就能处理多种数据类型,更像是OO中的多态。
(18)call( {func}, {arglist} [, {dict}])
使用参数arglist指定的参数,调用参数func指定的函数。要把这个函数与vim的: call 命令区别开,尽管:call命令最终也是调用这个函数的,不过两者的工作层级不同。
对于dict参数,在学习Dictionary操作函数时再去讲解。
示例代码:
function! MyFun(num1, num2) return a:num1 + a:num2 endfunction let sum = call("MyFun", [1,2]) echo sum let sum = call(function("MyFun"), [1,2]) echo sum ~
(19)index({list}, {expr} [, {start} [, {ic} ]] )
返回数组中元素值与给定值相同的第一个元素的索引,就是查找。
(20)max( {list} )
返回数组中值最大的元素的值,如果数组为空,则返回0
(21)min( {list} )
返回数组中值最小的元素的值,如果数组为空,则返回0
(22)count( )
返回值为给定参数的元素的个数。
(23)repeat({expr}, {count})
这个函数在前面字符串操作函数中已经学习过了。
示例代码:
let list = [1,2,3, 'a', 'a', 'b', 'c', 'hello'] echo index(list, 'hello') echo max(list) echo min(list) echo count(list, 'a') echo repeat(list, 3) ~
7 3 0 2 [1, 2, 3, 'a', 'a', 'b', 'c', 'hello', 1, 2, 3, 'a', 'a', 'b', 'c', 'hello', 1, 2, 3, 'a', 'a', 'b', 'c', 'hello']