我有以下代码来创建一个集合作为类的成员:
CustomClass new members:Set new; yourself.
接下来我要求大小
custom members size.
结果显然为0,但是当我在集合中插入自定义元素并且我要求大小时会导致错误,告诉我自定义元素不可索引。
custom members add: MyCustomElement new.
custom members size. -> error
这是为什么?如何解决Smalltalk中的这个问题?提前致谢
答案 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.