-

我们讲到的最后一种Vimscript类型将是字典。 Vimscript字典类似于Python中的dict,Ruby中的hash,和Javascript中的object。

字典用花括号创建。值是异质的,但键会被强制转换成字符串。就是这么简单,你没想到吧?

执行这个命令:

:echo {'a': 1, 100: 'foo'}

Vim显示{'a':1,'100':'foo'},这说明Vimscript的确把键强制转换为字符串,同时保留值不变。

Vimscript避免了Javascript标准的蠢笨之处,允许你在字典的最后一个元素后留下一个逗号。 (译注:在Javascript的标准中,最后一个元素后面不能留下一个逗号。 但在Firefox里,留下那个逗号是允许的,不过这是Firefox的问题。) 执行下面的命令:

:echo {'a': 1, 100: 'foo',}

Vim再次显示{'a':1,'100':'foo'}(译注:结尾小逗号不见了)。你应该_总是_在字典里留下一个多余的逗号, _尤其_是当字典的定义跨越多行的时候,这样增加新项的时候将不容易犯错。

索引

查找字典中的一个值的语法跟大多数语言是一样的。执行这个命令:

:echo {'a': 1, 100: 'foo',}['a']

Vim显示1。试试使用不是字符串的索引:

:echo {'a': 1, 100: 'foo',}[100]

Vim会在查找之前把索引强制转换成字符串,因为键只能是字符串,这么做是合理的。

当键仅由字母,数字和/或下划线组成时,Vimscript也支持Javascript风格的"点"查找。 试试下面的命令:

:echo {'a': 1, 100: 'foo',}.a
:echo {'a': 1, 100: 'foo',}.100

两种情况下,Vim都显示了正确的元素。使用哪种索引字典的方式取决于你自己的偏好。

赋值和添加

像对待变量一样赋值给字典中的项,就可以在字典中轻松地添加新的项。

:let foo = {'a': 1}
:let foo.a = 100
:let foo.b = 200
:echo foo

Vim显示{'a': 100, 'b': 200}。赋值和添加一个新项的方式是一样的。

移除项

有两种方法可以移除字典中的项。执行下面的命令:

:let test = remove(foo, 'a')
:unlet foo.b
:echo foo
:echo test

Vim显示{}100remove函数将移除给定字典的给定键对应的项,并返回被移除的值。 unlet命令也能移除字典中的项,只是不返回值。

你不能移除字典中不存在的项。试试执行这个命令:

:unlet foo["asdf"]

Vim抛出一个错误。

选择remove还是unlet很大程度上取决于个人偏好。如果非要我说,我推荐使用remove, 因为它比unlet更灵活。remove可以做任何unlet能做的事,反过来不成立。 所以选择remove可以一招鲜,吃遍天。

字典函数

就像列表,Vim有许许多多内置的字典函数。执行下面的命令:

:echom get({'a': 100}, 'a', 'default')
:echom get({'a': 100}, 'b', 'default')

Vim显示100default,如同列表版本的get函数.

你也可以检查给定字典里是否有给定的键。执行这个命令:

:echom has_key({'a': 100}, 'a')
:echom has_key({'a': 100}, 'b')

Vim显示10。不要忘了,Vimscript把0当作假而其他数字则是真。

你可以用items从一个字典中获取对应的键值对,执行这个命令:

:echo items({'a': 100, 'b': 200})

Vim将显示[['a',100],['b',200]]这样的嵌套列表。到目前为止,Vimscript字典_不一定_是有序的, 所以不要指望items的返回结果是有序的!

你可以用keys返回字典的所有的键和values返回所有的值。它们的作用一如其名——你可以查一下。

练习

阅读:help Dictionary。看完它。注意大写D

阅读:help get().

阅读:help has_key().

阅读:help items().

阅读:help keys().

阅读:help values().