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询问其实施情况的原因。如果您仍然能够提供我们要求的信息,这将是非常有帮助的,因为您所描述的不应该发生在这样一个简单的情况下。您得到的错误文本是什么?