2015-12-20 4 views
1

У меня есть следующий код, чтобы создать коллекцию в качестве члена класса:Pharo пользовательского класс не индексируемый (Smalltalk)

CustomClass new members:Set new; yourself. 

рядом я прошу размер

custom members size. 

что приводит в, очевидно, 0, но когда я вставляю пользовательский элемент в набор и запрашиваю размер, он приводит к ошибке, указывающей на то, что мои пользовательские элементы не индексируются.

custom members add: MyCustomElement new. 
custom members size. -> error 

Почему это? Как решить эту проблему в Smalltalk? Заранее спасибо

+0

Можете ли вы дать нам определение вашего 'MyCustomElement'? В частности, вы внедрили '# =' и '# hash'? – Tobias

+0

И не могли бы вы выставить описание * точной ошибки? Например. какой класс не индексируется? –

+0

@Tobias, что # = и #hash? – user2321611

ответ

1

Код, который вы выставили, не должен вызывать ошибку.
Но возможно, что вас укусил сообщение #add:.

#add: сообщение возвращает добавленный элемент, таким образом, вы можете цепи дополнения, как:

collection2 add: (collection1 add: element). 

Это также работает с #at: поставить:

collection2 at: j put: (collection1 at: i put: k). 

очень походит

c2[ j ] = c1[ i ] = k; 

Хотя, если вы пишете что-то вроде:

| s e | 
e := MyCustomElement new. 
s := (Set new) add: e. 
^s size 

, то переменная s укажет на тот же объект, что и на e, экземпляр MyCustomElement, а не на только что созданный набор.

Вышеприведенный пример, таким образом, отправит сообщение #size в экземпляр MyCustomElement, и этот звук очень похож на описанную вами ошибку: это может вызвать ошибку, поскольку экземпляры этого класса не являются индексируемыми.

Вы можете альтернативно написать:

(s := Set new) add: e. 

или использовать каскад, который заканчивается, посылая #yourself к Комплексу, эффективно возвращая сам набор:

s := (Set new) add: e; yourself. 
Смежные вопросы