Равенство по значению и равенство по ссылке со связанным списком
Кажется, очень трудно получить правильный источник информации о Squeak. У меня есть несколько основных вопросов по этому поводу:
'=' проверяет равенство по референции?
'==' проверяет равенство значений?
коллекция - связанный список - если я сделаю что-то вроде:
list := LinkedList new. element := list first.
Означает ли это, что элемент и "список первым" являются ссылками на одно и то же место в памяти (первое место в связанном списке?)
- почему мне нужно переопределить оператор = для связанного списка? и как мне это сделать?
1 ответ
По умолчанию ==
равенство по ссылке. В объекте =
определяется как
= anObject
^ self == anObject
Но другие классы обычно отменяют это. Например в Персонаже =
определяется как
= aCharacter
^ self == aCharacter or:[
aCharacter isCharacter and: [
self asciiValue = aCharacter asciiValue]]
Вы можете получить все разработчики =
выполняя #= implementors
,
В твоем случае element
а также list first
ссылаются на один и тот же объект. Это потому что first
реализуется как
first
^ self at: 1
А также at
возвращает элемент в позицию 1. Но если first
будет реализован как
first
^ (self at: 1) copy
тогда он вернет копию элемента (или если вы используете element := list first copy
) и тогда они вернутся false
по сравнению с ==
, но если =
реализован умным способом, он должен вернуть true
в большинстве случаев.
Также убедитесь, что вы хотите использовать LinkedList, потому что в pharo, который является форком скрипов, он используется в основном для планирования процессов, и я думаю, что было обсуждение, что LinkedList - это скорее набор утилит. Наиболее используемая коллекция с функциями произвольного доступа OrderedCollection