Странная ошибка

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Странная ошибка

Ryukzak Neskazov
Доброго времени суток.

Так сложилось, что сейчас пишу дипломный проект на smalltalk-e. И в
процессе написания новой функциональности, без видимой причины код
перестал корректно работать. В процессе отладки было замечено крайне
странное поведение системы - после инициализации рабочих объектов они
зачастую были в разных состояниях (объекты не работают с вводом/
выводом, нет переменных класса, нет многопоточности, старт в чистом
образе ни на что не влияет). После длительного поиска источника
проблем, путём выкидывания из кода всего, без чего странное поведение
сохраняется осталось примерно следующее:

Object subclass: #MyPoint
        instanceVariableNames: 'x y'
        classVariableNames: ''
        poolDictionaries: ''
        category: 'Hetsi-Core-Test'!

= anPoint
        ^ (self x = anPoint x) & (self y = anPoint y)
        " or this code: ^ (self x = anPoint x) and: [self y = anPoint y]"! !

x
        ^ x! !

x: v
        x := v! !

y
        ^ y! !

y: v
        y := v! !

---------------------------------------------------

Object subclass: #MyTest
        instanceVariableNames: 'dic'
        classVariableNames: ''
        poolDictionaries: ''
        category: 'Hetsi-Core-Test'!

add: anArray
        dic add: (MyPoint new x: (anArray at: 1); y: (anArray at: 2))! !

initialize
        dic := Set new! !

size
        ^ dic size! !

--------------------------------------------------

(1 to: 10) collect: [ :e |
        | x |
        x := MyTest new.
        x add: {#a1. #b1}.
        x add: {#a1. #b1}.
        x add: {#a2. #b2}.
        x add: {#a2. #b2}.
        x size.
] #(4 4 4 4 3 4 3 3 4 3)

Последняя часть кода выполняется в ворспейсе, и результат его
выполнения, который меняется от раза к разу. Есть какие-нибудь теории
почему так происходит?

Squeak 4.1 и Pharo 1.0

PS Ошибку исправил, но почему этот код не работает корректно не понял.

--
http://groups.google.ru/group/sugr
Reply | Threaded
Open this post in threaded view
|

Re: Странная ошибка

Alexander Batalshikov
Если вы определяете для класса метод  '=', то вы обязаны также определить и метод 'hash' (с той же семантикой).
Попробуйте несколько раз выполнить:
(MyPoint new x: 1; y: 1) hash

--
http://groups.google.ru/group/sugr