Равенство по значению и равенство по ссылке со связанным списком

Кажется, очень трудно получить правильный источник информации о Squeak. У меня есть несколько основных вопросов по этому поводу:

  1. '=' проверяет равенство по референции?

  2. '==' проверяет равенство значений?

  3. коллекция - связанный список - если я сделаю что-то вроде:

    list := LinkedList new.
    
    element := list first.
    

Означает ли это, что элемент и "список первым" являются ссылками на одно и то же место в памяти (первое место в связанном списке?)

  1. почему мне нужно переопределить оператор = для связанного списка? и как мне это сделать?

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

Другие вопросы по тегам