字典大小为0

时间:2017-11-27 22:21:22

标签: smalltalk pharo

是否有一些特殊的方法来获取字典大小?

我在其中添加了两个元素。使用STON返回打印:

{'1':DBDiceBag{#dice:OrderedCollection[]},'2':DBDiceBag{#dice:OrderedCollection[]}}

这是正确的。但是使用

r myDIctionary size

始终返回0。 是否有一些解决方法或如何做?

1 个答案:

答案 0 :(得分:2)

Smalltalk 中最常出现的错误之一就是忘记方法中的显式结果标记^

基于这个问题,这将是最合理的解释,所以让我详细说明。

假设您有一个类R,它定义了一个实例变量dictionary,它碰巧拥有Dictionary的某个实例。这种伊娃的吸气剂看起来就像:

myDictionary
  ^dictionary

但是,如果我们忘记了返回令牌,我们的代码将会读取

myDictionary
  dictionary

没有任何显式返回。因此,此邮件的发件人将获得隐式返回,即self(表示myDictionary的接收者)。换句话说,这相当于

myDictionary
  dictionary.
  ^self                  "<- no need to make this explicit here"

并且发件人将获得R的实例,而不是其dictionary ivar。因此,表达式

r myDictionary size

会将#size发送到r myDictionary的结果,而我们的错误只是r。换句话说,它等同于

r size

因为在Smalltalk中,每个Object都会响应#size,这不会引起MessageNotUnderstood异常,并且错误仍然会被忽视。

现在,为什么r size0?因为,默认情况下,非阵列对象以零响应#size,表示它们具有0索引槽。您可以更改此默认行为并使用其他内容覆盖#size,但如果您不知道将会发生这种情况。