Smalltalk 值相等和引用相等与链表相等
似乎很难获得有关Squeak的正确信息来源。 我有几个基本问题:Smalltalk 值相等和引用相等与链表相等,smalltalk,squeak,pharo,Smalltalk,Squeak,Pharo,似乎很难获得有关Squeak的正确信息来源。 我有几个基本问题: “=”是否通过引用检查是否相等 “==”是否检查值是否相等 集合-链接列表-如果我执行以下操作: list := LinkedList new. element := list first. 这是否意味着元素和“列表优先”都是对内存中同一位置(链接列表中的第一个位置)的引用 为什么我需要重写链表的运算符=呢?我该怎么做 默认情况下,==在引用方面是相等的。在对象=中定义为 = anObject ^ self == a
list := LinkedList new.
element := list first.
默认情况下,
==
在引用方面是相等的。在对象=
中定义为
= anObject
^ self == anObject
= aCharacter
^ self == aCharacter or:[
aCharacter isCharacter and: [
self asciiValue = aCharacter asciiValue]]
但其他类通常会覆盖它。例如,在字符=
中定义为
= anObject
^ self == anObject
= aCharacter
^ self == aCharacter or:[
aCharacter isCharacter and: [
self asciiValue = aCharacter asciiValue]]
通过执行#=implementors
,可以获取=
的所有实现者
在您的情况下,元素
和首先列出
引用同一对象。这是因为first
实现为
first
^ self at: 1
和at
返回位置1上的元素。但是如果第一个将作为
first
^ (self at: 1) copy
然后它将返回一个元素的副本(或者如果您使用元素:=列出第一个副本
),然后与=
相比,它们将返回false
,但是如果=
以智能方式实现,则在大多数情况下它应该返回true
另外,请确保您希望使用LinkedList,因为其中的一个分支主要用于进程调度,我认为有人讨论过LinkedList更像是一个实用程序集合。最常用的具有随机访问功能的集合是OrderedCollection
您可能指的是list:=LinkedList new。是的。。。。你是对的