是否有一些特殊的方法来获取字典大小?
我在其中添加了两个元素。使用STON返回打印:
{'1':DBDiceBag{#dice:OrderedCollection[]},'2':DBDiceBag{#dice:OrderedCollection[]}}
这是正确的。但是使用
r myDIctionary size
始终返回0。 是否有一些解决方法或如何做?
答案 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 size
是0
?因为,默认情况下,非阵列对象以零响应#size
,表示它们具有0
索引槽。您可以更改此默认行为并使用其他内容覆盖#size
,但如果您不知道将会发生这种情况。