JSRUN 用代码说话

字典

编辑教程

字典

我们讲到的最后一种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显示{}和100。remove函数将移除给定字典的给定键对应的项,并返回被移除的值。 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显示100和default,如同列表版本的get函数.

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

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

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

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

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

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

JSRUN闪电教程系统是国内最先开创的教程维护系统, 所有工程师都可以参与共同维护的闪电教程,让知识的积累变得统一完整、自成体系。 大家可以一起参与进共编,让零散的知识点帮助更多的人。
X
支付宝
9.99
无法付款,请点击这里
金额: 0
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间
如有疑问请联系QQ:565830900
正在生成二维码, 此过程可能需要15秒钟