VimScript脚本语言学习------常用的内置函数---(操纵List)

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

注意:get()函数和数组方式的索引(方括号语法)类似,只是索引值无效时,get()不会报错,而数组语法会报错。

(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:


默认初值为0,默认步进为1,这么理解就可以了。

(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']



你可能感兴趣的:(VimScript脚本语言学习------常用的内置函数---(操纵List))