ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
我们讲到的最后一种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`的返回结果是有序的! 你可以用`keys`返回字典的所有的键和`values`返回所有的值。它们的作用一如其名——你可以查一下。 ## 练习 阅读`:help Dictionary`。看完它。注意大写`D`。 阅读`:help get()`. 阅读`:help has_key()`. 阅读`:help items()`. 阅读`:help keys()`. 阅读`:help values()`.