Pharo Smalltalk LinkedList可能存在异常

时间:2019-06-18 08:38:27

标签: data-structures smalltalk pharo

我认为实现at:put:LinkedList方法存在一个错误。

使用Stacked类(LinkedList的后代)时,我检测到该问题。当使用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 个答案:

答案 0 :(得分:0)

让我们总结一下评论中的内容。

  1. LinkedList是经过优化的SequenceableCollection,用于在任何位置插入和删除(元素)。
  2. LinkedList中的元素会自动包装在ValueLink对象中,这些对象将原始对象保存在其value ivar中,并且可以链接到列表中的下一个元素(如果有)。当LinkedList收到以下任何消息时,就会发生这种情况:

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

    将常规对象和Links都接受为参数。

  3. 还提供了另外两个 public 消息:

    add:afterLink:addBeforeLink:

  4. 删除元素的协议包括:

    remove:ifAbsent:removeAllremoveAllSuchThat:removeFirstremoveLast

    remove:removeAllSuchThat:都是 dual ,因为要删除的元素可以是包裹在Link或{{1 }}本身。其他方法,例如Link都继承自remove:或更高版本。

  5. 枚举方法是集合的常用方法(所有方法基本上都来自SquenceableCollection),并且再次是对偶的(请参见上文)。

其他访问方法,例如#do:at:put:at:putLink:等,应视为atLink:,因为它们依赖于非客户的关注。


回到问题,在位置4添加元素private的正确方法应该是

x

代替s add: x before: s lastLink