Smalltalk中的关联集合和字典之间有什么区别?

时间:2015-06-05 13:46:48

标签: dictionary smalltalk amber-smalltalk

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

如果我PrintIt,我会变成白色'。如果我删除' asDictionary',我仍然会得到白色'。字典给了我一些关联集合不是什么?

2 个答案:

答案 0 :(得分:7)

#{exp1 . sxp2 . exp3}这样的表达式是特定的,并创建一个 HashedCollection ,这是一种特殊的字典,其中键是字符串(可能在Javascript中你使用像这样的东西很多)。

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

#asDictionary是一个集合的方法,它将集合转换为字典,因为集合的元素是关联。因此,如果你想用字符串以外的键创建一个字典,你可以这样做:

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

答案 1 :(得分:2)

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

字典为您提供的优势,与您可能想要使用的其他集合相比,它具有处理关联的专门方法。

Dictionary提供:
 removeKey: aKey .删除aKey
 includesKey: aKey .检查密钥的存在  includes: aValue .检查值是否存在  <{p}}的简写at:put: .

anAssociation := Association key:value:   .
aDictionary add:    

e.g。

anAssociation := Association key:   'Hello' 
                             value: 'A greeting people often use' .
aDictionary add: anAssociation .

如果密钥已存在于词典中,则at:put将使用新值覆盖预先存在的值,因此检查并确保在添加新项目时密钥具有唯一值非常重要。

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

您可以通过

创建一个关联
anAssociation := Association key: 'keyOfElement' value: 'valueOfElement'  

或者,更简洁,

anAssociation := 'keyOfElement' -> 'valueOfElement'  

如果您想使用完全由Symbol制作的密钥,还有Class IdentityDictionary