我认为实现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个。
答案 0 :(得分:0)
让我们总结一下评论中的内容。
LinkedList
是经过优化的SequenceableCollection
,用于在任何位置插入和删除(元素)。 LinkedList
中的元素会自动包装在ValueLink
对象中,这些对象将原始对象保存在其value
ivar中,并且可以链接到列表中的下一个元素(如果有)。当LinkedList
收到以下任何消息时,就会发生这种情况:
add:
,add:after:
,add:before:
addFirst:
和addLast:
。
将常规对象和Links
都接受为参数。
还提供了另外两个 public 消息:
add:afterLink:
和addBeforeLink:
删除元素的协议包括:
remove:ifAbsent:
,removeAll
,removeAllSuchThat:
,removeFirst
和removeLast
remove:
和removeAllSuchThat:
都是 dual ,因为要删除的元素可以是包裹在Link
或{{1 }}本身。其他方法,例如Link
都继承自remove:
或更高版本。
SquenceableCollection
),并且再次是对偶的(请参见上文)。其他访问方法,例如#do:
,at:put:
,at:putLink:
等,应视为atLink:
,因为它们依赖于非客户的关注。
回到问题,在位置4添加元素private
的正确方法应该是
x
代替s add: x before: s lastLink
。