我有以下代码作为类的成员创建集合:
CustomClass new members:Set new; yourself.
接下来我要的尺寸
custom members size.
这显然会导致0,但当我在集合中插入自定义元素并询问大小时,会导致一个错误,告诉我我的自定义元素不可索引。
custom members add: MyCustomElement new.
custom members size. -> error
为什么会这样?如何在Smalltalk中解决这个问题?提前感谢
您展示的代码不应该触发错误
但你可能被#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.
或者使用级联,通过将#自己发送到集合结束,有效地返回集合本身:
s := (Set new) add: e; yourself.