字典

我们要讲的最后一种 Vimscript 变量类型是字典。 Vimscript 字典类似于 Python 的字典、Ruby 的哈希、以及 Javascript 的对象。

字典可以用花括号来创建。值可以是各种类型,但是键总是会被强转为字符串。 你不会期待凡事都是完全一样的,对吧?

运行以下命令:

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

Vim 显示 {'a': 1, '100': 'foo'},这表示 Vimscript 确实把键强转为了字符串,而保留值的类型不动。

Vimscript 不像 Javascript 标准那么愚钝,它允许在字典的最后一个元素后面添加逗号。 运行以下命令:

: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 的结果都是按照特定顺序的!

你可以用 keysvalues 函数来获取所有的键或值。看看它们是否按预期运行。

练习

阅读 :help Dictionary 的所有内容。 注意 D 是大写的。

阅读 :help get()

阅读 :help has_key()

阅读 :help items()

阅读 :help keys()

阅读 :help values()

原文地址:http://learnvimscriptthehardway.stevelosh.com/chapters/37.html