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

时间:2015-12-20 14:23:45

标签: collections smalltalk pharo

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

 CustomClass new members:Set new; yourself.

接下来我要求大小

custom members size.

结果显然为0,但是当我在集合中插入自定义元素并且我要求大小时会导致错误,告诉我自定义元素不可索引。

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

这是为什么?如何解决Smalltalk中的这个问题?提前致谢

1 个答案:

答案 0 :(得分:1)

您展示的代码不应触发错误 但是你可能被#add:消息所困扰。

#add:消息返回添加的元素,这样您就可以链接添加内容,如:

collection2 add: (collection1 add: element).

这也适用于#at:put:

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的实例)相同的对象,而不是指向新创建的Set。

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

您也可以写:

(s := Set new) add: e.

或使用通过将#yourself发送到Set而结束的级联,有效地返回集合本身:

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