字典
编辑教程字典
我们讲到的最后一种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的返回结果是有序的!
选择支付方式:
备注:
转账时请填写正确的金额和备注信息,到账由人工处理,可能需要较长时间