簡體   English   中英

Pharo Smalltalk LinkedList 可能的異常

[英]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 個。

讓我們總結一下評論中的內容。

  1. LinkedList是一個SequenceableCollection針對在任何位置插入和刪除(元素)進行了優化。
  2. LinkedList內的元素會自動包裝在ValueLink對象中,這些對象將原始對象保存在其value ivar 中,並且可以鏈接到列表中的下一個元素(如果有)。 LinkedList收到以下任何消息時,就會發生這種情況:

    add: , add:after: , add:before: addFirst:addLast:

    它接受常規對象和Links作為參數。

  3. 提供的另外兩條公共消息是:

    add:afterLink:addBeforeLink:

  4. 刪除元素的協議包括:

    remove:ifAbsent:removeAllremoveAllSuchThat:removeFirstremoveLast

    remove: , removeAllSuchThat:都是雙重的,因為要刪除的元素可以是包裹在Link的對象,也可以是Link本身。 其他方法如remove:繼承自SquenceableCollection或更高版本。

  5. 枚舉方法是集合的常用方法(所有這些方法本質上都是從#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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM