【问题标题】:Pharo custom class is not indexable (smalltalk)Pharo 自定义类不可索引 (smalltalk)
【发布时间】:2015-12-20 14:23:45
【问题描述】:

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

 CustomClass new members:Set new; yourself.

接下来我问尺寸

custom members size.

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

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

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

【问题讨论】:

  • 你能给我们你的MyCustomElement的定义吗?特别是,你实现了#=#hash吗?
  • 您能否发布 exact 错误描述?例如。哪个类不可索引?
  • @Tobias #= 和 #hash 是什么?
  • #=#hash 是每个对象都实现的方法。如果您覆盖#=,您通常还必须覆盖#hash,因为基于散列的集合是如何工作的。散列集合上的#size 可以使用#hash 进行查找。这就是 Tobias 询问他们的实施的原因。如果您仍能提供我们要求的信息会很有帮助,因为您所描述的情况不应该在这种简单的情况下发生。
  • 你得到的错误文本是什么?

标签: collections smalltalk pharo


【解决方案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 发送到集合结束的级联,有效地返回集合本身:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多