我很迷惑vimscript extend()函數的一個微妙之處。爲什麼extend()在兩次傳遞同一個列表時參與了奇怪的行爲?
如果你用它來與另一個列表擴展列表,因此它幾乎你所期望的東西,這是插入第二張名單到第一列表中的第三個參數給出的指數爲:
let list1 = [1,2,3,4,5,6] | echo extend(list1,[1,2,3,4,5,6],5)
" [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6, 6]
但是,如果你給它兩次相同的列表,它開始跳出一點。
let list1 = [1,2,3,4,5,6] | echo extend(list1,list1,0)
" [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]
let list1 = [1,2,3,4,5,6] | echo extend(list1,list1,1)
" [1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6]
let list1 = [1,2,3,4,5,6] | echo extend(list1,list1,2)
" [1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 5, 6]
let list1 = [1,2,3,4,5,6] | echo extend(list1,list1,3)
" [1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 5, 6]
let list1 = [1,2,3,4,5,6] | echo extend(list1,list1,4)
" [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 5, 6]
let list1 = [1,2,3,4,5,6] | echo extend(list1,list1,5)
" [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 6]
let list1 = [1,2,3,4,5,6] | echo extend(list1,list1,6)
" [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]
特易混淆,當列表與兩個不同的變量引用此行爲適用:
let list1 = [1,2,3,4,5,6] | let list2 = list1 | echo extend(list1,list2,4)
" [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 5, 6]
這完全是匪夷所思我。我無法理解這個功能的用途,而且當你只想將一個列表插入另一個列表並且沒有意識到變量引用了相同的數組時,似乎很容易調用它。
的文檔說以下內容:
如果都是|收藏|:把{expr2}裏{expr1}的。
如果給出{expr3},則在{expr1}中的項{expr3}之前插入{expr2}的項。
當{expr3}爲零時,在第一項之前插入。
當{expr3}等於len({expr1})時,附加{expr2}。
實例:
:echo sort(extend(mylist, [7, 5]))
:call extend(mylist, [2, 3], 1)
如果{expr1}的是相同的列表爲{表達式2}然後複製的項目數等於所述列表的原始長度。例如,當{expr3}爲1時,你會得到第一個項目的N個新副本(其中N是列表的原始長度)。
是否在我沒有得到某種程度上,這是有意義的,還是僅僅是一個偏心?