Vimscript 字典

2018-02-24 16:02 更新

我們講到的最后一種Vimscript類型將是字典。 Vimscript字典類似于Python中的dict,Ruby中的hash,和Javascript中的object。

字典用花括號(hào)創(chuàng)建。值是異質(zhì)的,但鍵會(huì)被強(qiáng)制轉(zhuǎn)換成字符串。就是這么簡單,你沒想到吧?

執(zhí)行這個(gè)命令:

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

Vim顯示{'a':1,'100':'foo'},這說明Vimscript的確把鍵強(qiáng)制轉(zhuǎn)換為字符串,同時(shí)保留值不變。

Vimscript避免了Javascript標(biāo)準(zhǔn)的蠢笨之處,允許你在字典的最后一個(gè)元素后留下一個(gè)逗號(hào)。 (譯注:在Javascript的標(biāo)準(zhǔn)中,最后一個(gè)元素后面不能留下一個(gè)逗號(hào)。 但在Firefox里,留下那個(gè)逗號(hào)是允許的,不過這是Firefox的問題。) 執(zhí)行下面的命令:

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

Vim再次顯示{'a':1,'100':'foo'}(譯注:結(jié)尾小逗號(hào)不見了)。你應(yīng)該_總是_在字典里留下一個(gè)多余的逗號(hào),?_尤其_是當(dāng)字典的定義跨越多行的時(shí)候,這樣增加新項(xiàng)的時(shí)候?qū)⒉蝗菀追稿e(cuò)。

索引

查找字典中的一個(gè)值的語法跟大多數(shù)語言是一樣的。執(zhí)行這個(gè)命令:

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

Vim顯示1。試試使用不是字符串的索引:

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

Vim會(huì)在查找之前把索引強(qiáng)制轉(zhuǎn)換成字符串,因?yàn)殒I只能是字符串,這么做是合理的。

當(dāng)鍵僅由字母,數(shù)字和/或下劃線組成時(shí),Vimscript也支持Javascript風(fēng)格的"點(diǎn)"查找。 試試下面的命令:

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

兩種情況下,Vim都顯示了正確的元素。使用哪種索引字典的方式取決于你自己的偏好。

賦值和添加

像對(duì)待變量一樣賦值給字典中的項(xiàng),就可以在字典中輕松地添加新的項(xiàng)。

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

Vim顯示{'a': 100, 'b': 200}。賦值和添加一個(gè)新項(xiàng)的方式是一樣的。

移除項(xiàng)

有兩種方法可以移除字典中的項(xiàng)。執(zhí)行下面的命令:

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

Vim顯示{}100remove函數(shù)將移除給定字典的給定鍵對(duì)應(yīng)的項(xiàng),并返回被移除的值。?unlet命令也能移除字典中的項(xiàng),只是不返回值。

你不能移除字典中不存在的項(xiàng)。試試執(zhí)行這個(gè)命令:

:unlet foo["asdf"]

Vim拋出一個(gè)錯(cuò)誤。

選擇remove還是unlet很大程度上取決于個(gè)人偏好。如果非要我說,我推薦使用remove, 因?yàn)樗?code>unlet更靈活。remove可以做任何unlet能做的事,反過來不成立。 所以選擇remove可以一招鮮,吃遍天。

字典函數(shù)

就像列表,Vim有許許多多內(nèi)置的字典函數(shù)。執(zhí)行下面的命令:

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

Vim顯示100default,如同列表版本的get函數(shù).

你也可以檢查給定字典里是否有給定的鍵。執(zhí)行這個(gè)命令:

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

Vim顯示10。不要忘了,Vimscript把0當(dāng)作假而其他數(shù)字則是真。

你可以用items從一個(gè)字典中獲取對(duì)應(yīng)的鍵值對(duì),執(zhí)行這個(gè)命令:

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

Vim將顯示[['a',100],['b',200]]這樣的嵌套列表。到目前為止,Vimscript字典_不一定_是有序的, 所以不要指望items的返回結(jié)果是有序的!

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

練習(xí)

閱讀:help Dictionary??赐晁?。注意大寫D。

閱讀:help get().

閱讀:help has_key().

閱讀:help items().

閱讀:help keys().

閱讀:help values().

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)