Vim脚本之字典类型

复合类型之字典

  • 和其他语言一样, 字典保存键值对; 可以通过键, 快速找到值; 字典里的键值对是无序存储的.
  • 字典是引用对象,在传递时, 需要不想改变原对象,最好使用copy(), 传递拷贝.
  • 字典的键必须是字符串, 其中’04’ 和 04 是不同的字符串, 后面会转换为 ‘4’;
  • 值可以是任何表达式;

建立字典

1
2
3
4
5
let dic_test = {'one': 'ding', 'two': 'liu', 'three': 'jiang'}
echo dic_test['one']

" 空字典
let empty_dic = {}

字典与列表的转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
" 可以得到键列表
for key in keys(dic_test)
echo key
endfor

" keys() 返回的键列表是没有顺序的,可以用sort进行排序
for key in sort(keys(dic_test))
echo key
endfor

" values()可以获取值得列表
for value in valus(dic_test)
echo value
endfor

" items() 获取key,value的列表[[key1, val1], [key2, val2], ...]
for [key, value] in items(dic_test)
echo key . ' ' . value
endfor

字典同一

  • 字典也是引用类型, 需要用copy() 和 deepcopy()构造字典的备份, 否则赋值等产生的结果会引用同一对象.
1
2
3
4
let onedict = ['a': 1, 'b': 2]
let twodict = onedict
let twodict['a'] = 11
echo onedict.a " 11

字典修改

  • 要修改字典已经存在的项目或增加新的项目,用let:
1
2
let dict[4] = 'four'
let dict['one'] = item
  • 字典里面删除项目用remove() 或unlet:
1
2
3
let i = remove(dict, 'aaa')
unlet dict.aaaa
unlet dict['aaa']
  • 字典合并
1
call extend(adict, bdict)

这使得adict得到扩展, 加入所有的bdict项目; 对于重复的键, adict项目会被覆盖;可选的第三个参数可以该百年此点.

  • 字典里面删除多个项目可以用filter():
1
2
call filter(dict, 'v:val =~ "x"')
" 删除dict中所有不匹配"x"的item.

字典函数

  • 简单的取值
1
2
3
4
5
6
" 取值的方法
echo dic_test['one']

echo dic_test.one
" 则只能用于由ASCII字母,数字和下划线组成的键, 此方法也可以用于赋值
let dic_test.four = 'wang'
  • 定义函数并将它的引用放在字典中
1
2
3
4
5
6
function dic_test.translate(line) dict
return join(map(split(a:line), 'get(self, v:val, "???")'))
endfunction

echo dic_test.translate('three one five two')
" 输出: jiang ding ??? liu

join() 函数与split()函数相反, 它合并单词, 中间放分隔符; 经常使用split(), map(), join() 对单词组成的行进行过滤.

字典相关函数

1
2
3
4
5
6
7
8
if has_key(dict, 'foo')        " 如果 dict 有带 "foo" 键的项目则为真
if empty(dict) " 如果 dict 为空则为真
let l = len(dict) " dict 项目的数量
let big = max(dict) " dict 项目的最大值
let small = min(dict) " dict 项目的最小值
let xs = count(dict, 'x') " 统计 dict 里 'x' 出现的数目
let s = string(dict) " dict 的字符串表示
call map(dict, '">> " . v:val') " 在每个项目前加上 ">> "

更多详细内容请: :h Dictionary