[英]Pharo Smalltalk LinkedList possible anomaly
我認為在實現 at:put: LinkedList 方法時存在一個錯誤。
我在使用 LinkedList 的后代 Stack 類時檢測到了這個問題。 當使用 at:put: 方法為列表的最后一個元素賦值時,其他元素從列表中消失了。 當后一個元素指向列表中已有的其他元素時,就會發生這種情況。 我懷疑這是錯誤還是功能。
s := LinkedList new.
x := (NewValueHolder value: 99).
s
add: (NewValueHolder value: 99);
add: x;
add: (NewValueHolder value: 99);
add: (NewValueHolder value: 99).
s at: 4 put: x.
s
我想,運行列表后只包含 2 個元素,而不是預期的 4 個。
讓我們總結一下評論中的內容。
LinkedList
是一個SequenceableCollection
針對在任何位置插入和刪除(元素)進行了優化。 LinkedList
內的元素會自動包裝在ValueLink
對象中,這些對象將原始對象保存在其value
ivar 中,並且可以鏈接到列表中的下一個元素(如果有)。 當LinkedList
收到以下任何消息時,就會發生這種情況:
add:
, add:after:
, add:before:
addFirst:
和addLast:
。
它接受常規對象和Links
作為參數。
提供的另外兩條公共消息是:
add:afterLink:
和addBeforeLink:
刪除元素的協議包括:
remove:ifAbsent:
、 removeAll
、 removeAllSuchThat:
、 removeFirst
和removeLast
remove:
, removeAllSuchThat:
都是雙重的,因為要刪除的元素可以是包裹在Link
的對象,也可以是Link
本身。 其他方法如remove:
繼承自SquenceableCollection
或更高版本。
#do:
派生的),並且再次是雙重的(見上文)。 其他訪問方法,例如at:put:
、 at:putLink:
、 atLink:
等,應該被視為private
,因為它們依賴於客戶端不關心的實現細節。
回到問題,在位置 4 添加元素x
的正確方法是
s add: x before: s lastLink
而不是s at: 4 put: x
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.