Collections Pharo自定义类不可索引(smalltalk)

Collections Pharo自定义类不可索引(smalltalk),collections,smalltalk,pharo,Collections,Smalltalk,Pharo,我有以下代码来创建作为类成员的集合: CustomClass new members:Set new; yourself. 接下来我要尺寸 custom members size. 这显然会导致0,但当我在集合中插入自定义元素并询问其大小时,它会导致一个错误,告诉我我的自定义元素不可索引 custom members add: MyCustomElement new. custom members size. -> error 为什么会这样?在Smalltalk中如何解决这个问题

我有以下代码来创建作为类成员的集合:

 CustomClass new members:Set new; yourself.
接下来我要尺寸

custom members size.
这显然会导致0,但当我在集合中插入自定义元素并询问其大小时,它会导致一个错误,告诉我我的自定义元素不可索引

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

为什么会这样?在Smalltalk中如何解决这个问题?提前感谢

您展示的代码不应触发错误。
但你可能被“添加:信息”咬了

#add:消息返回添加的元素,通过这种方式可以链接添加,如:

collection2 add: (collection1 add: element).
这也适用于#at:put:

很像

c2[ j ] = c1[ i ] = k;
但是,如果你写了以下内容:

| s e |
e := MyCustomElement new.
s := (Set new) add: e.
^s size
然后,变量s将指向与e相同的对象(MyCustomElement的实例),而不是新创建的集合

因此,上面的示例将消息#size发送到MyCustomElement的实例,这听起来非常像您描述的错误:这可能会触发错误,因为此类的实例不可索引

custom members add: MyCustomElement new.
custom members size.  -> error
你也可以写:

(s := Set new) add: e.
或者使用一个级联,通过将自己发送到集合,有效地返回集合本身来结束:

s := (Set new) add: e; yourself.

您能告诉我们您的
MyCustomElement
的定义吗?特别是,您是否实现了
#=
#hash
?您能否发布准确的错误描述?例如,哪个类是不可索引的?@Tobias什么是#=和#hash?
#=
#hash
是每个对象实现的方法。如果覆盖
#=
,通常还必须覆盖
#hash
,因为基于hash的集合是如何工作的<代码>#大小对于散列集合,可以使用
#散列
进行查找。这就是Tobias询问其实施情况的原因。如果您仍然能够提供我们要求的信息,这将是非常有帮助的,因为您所描述的不应该发生在这样一个简单的情况下。您得到的错误文本是什么?