2010-04-03 21 views
0

我很迷惑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是列表的原始長度)。


是否在我沒有得到某種程度上,這是有意義的,還是僅僅是一個偏心?

回答

0

我想我在發帖時已經想到了這一點,但是由於我的問題都是經過編輯和所有的,所以我想我可能會經歷它。

extend()修改第一個列表。第二個參數是隻讀的。因此,它看起來像是在將第二個列表中的元素插入到第一個列表中時將它們逐個重複。當這兩個都是相同的名單,這不起作用。但處理這個邊緣案件並不夠智能,所以事情會變得很糟糕。

我還沒有找到任何文件來支持這一點,但假設與證據相符。我想我可以閱讀源代碼獲取更多信息。

這仍然是一種奇怪的,因爲我會想,既然這些都是「名單」它的工作有點不同,比如先複製整個列表,然後通過只是交換周圍plunking下來到第一個頭/尾的指針。這可能不會更快,但它會照顧邊緣情況。不過,也許這是一個功能。我仍然樂於接受有關這可能實際上有用的理由的建議。

否則我想我會提交一個錯誤報告。有人知道vim是否有一個公共bug跟蹤器?我感到奇怪的寫在電子郵件地址,而不檢查它是否是一個已知的問題。

相關問題