Dictionary Smalltalk中的关联集合和词典有什么区别?

Dictionary Smalltalk中的关联集合和词典有什么区别?,dictionary,smalltalk,amber-smalltalk,squeak,pharo,Dictionary,Smalltalk,Amber Smalltalk,Squeak,Pharo,如果我打印它,我会得到“白色”。如果我删除'asDictionary',我仍然会得到'white'。字典给了我什么关联集合没有的东西?像{exp1.sxp2.exp3}这样的表达式是特定的,它创建了一个HashedCollection,这是一种特殊的字典,其中键是字符串(可能在Javascript中经常使用类似的东西) 在其他的小谈话中,没有这样的表达。相反,在中引入了类似于:{exp1.sxp2.exp3}(没有前导的#)的数组表达式,并且在(这是一种吱吱声)和琥珀色中也可用。现在,数组表达式

如果我打印它,我会得到“白色”。如果我删除'asDictionary',我仍然会得到'white'。字典给了我什么关联集合没有的东西?

{exp1.sxp2.exp3}
这样的表达式是特定的,它创建了一个HashedCollection,这是一种特殊的字典,其中键是字符串(可能在Javascript中经常使用类似的东西)

在其他的小谈话中,没有这样的表达。相反,在中引入了类似于:
{exp1.sxp2.exp3}
(没有前导的
#
)的数组表达式,并且在(这是一种吱吱声)和琥珀色中也可用。现在,数组表达式创建了一个数组,因此您必须对
#at:
消息使用整数。例如,
dict at:2
将返回一个关联
'bar'->'yellow'
,因为它位于您创建的数组的第二个位置

#asDictionary
是一种集合方法,它将集合中的元素转换为关联,从而将其转换为字典。因此,如果您想创建一个包含键而不是字符串的字典,可以这样做:

| dict |
dict := #{'foo'->'brown'. 'bar'->'yellow'.
          'qix'->'white'. 'baz'->'red'. 'flub'->'green'} asDictionary.
dict at: 'qix'

字典是
关联的集合。事实上,它是Smalltalk的典型协会集合。(关联类的实例是键值对,其中值可以是任何类的对象)

字典给你的好处是它有专门的方法来处理关联,与你可能会尝试使用的其他集合相比

字典提供:
removeKey:aKey.
删除aKey
includeKey:aKey.
检查密钥是否存在
包括:aValue。
检查是否存在值
at:put:.
的简写

dict := {
    'foo' -> 'brown'  .
        1 -> 'yellow' .
    3 @ 4 -> 'white'  .
   #(1 2) -> 'red' } asDictionary
e、 g

如果该键已存在于字典中,则
at:put
将用新值覆盖先前存在的值,因此在添加新项时检查并确保该键具有唯一值非常重要

键和值都可以是任何类的对象实例。字典中的每个关联都可以是任何类型的对象,每个键和值都可能是字典中每个其他元素的不同对象类的实例

您可以通过以下方式创建关联:

anAssociation := Association key:   'Hello' 
                             value: 'A greeting people often use' .
aDictionary add: anAssociation .
或者更简洁地说

anAssociation := Association key: 'keyOfElement' value: 'valueOfElement'  

如果您想使用完全由
符号
制成的键,还有
标识字典

n.b.
{}因为Squeak、Dolphin Smalltalk或Amber不支持字典
。它是一种特定于Pharo的方便语法,至少适用于Pharo 1.4以上版本。
anAssociation := Association key: 'keyOfElement' value: 'valueOfElement'  
anAssociation := 'keyOfElement' -> 'valueOfElement'