【发布时间】:2019-06-18 08:38:27
【问题描述】:
我认为在实现 at:put: LinkedList 方法时存在错误。
我在使用 Stack 类(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 个。
【问题讨论】:
-
这是预期的行为。请参阅
#at:putLink:中的评论,上面写着请不要放置已在列表中的链接,否则会造成无限循环。将#at:put:视为此类中的私有。 -
我不知道...它在“访问”协议中,而不是在“私有”协议中。 'at: put:' 方法 (Pharo 7) 上没有 cmets。
-
我认为这是“异常”。该方法应归类为私有。
-
但是您是否知道任何建立我所指出的这种行为的链表规范?
-
LinkedList预计将高效支持插入和删除消息,例如#add:、#add:before:、#add:after:、addFirst:和#remove:,#removeFirst和#removeLast。它还有望支持一些枚举消息,例如#do:,您可以从中派生用于选择、拒绝和收集的消息。客户端不应该使用低级消息,例如#at:put:。事实上,LinkedList抽象的全部意义在于让客户不必关心实现细节。
标签: data-structures smalltalk pharo