【问题标题】:What is the difference between a collection of associations and a dictionary in Smalltalk?Smalltalk 中的关联集合和字典有什么区别?
【发布时间】:2015-06-05 13:46:47
【问题描述】:
| dict |
dict := #{'foo'->'brown'. 'bar'->'yellow'.
          'qix'->'white'. 'baz'->'red'. 'flub'->'green'} asDictionary.
dict at: 'qix'

如果我PrintIt,我会得到“白色”。如果我删除“asDictionary”,我仍然会得到“白色”。字典给了我什么是关联集合没有的?

【问题讨论】:

    标签: dictionary smalltalk amber-smalltalk


    【解决方案1】:

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

    在其他smalltalks中没有这样的表达方式。取而代之的数组表达式看起来像:{exp1 . sxp2 . exp3}(没有前导 #)在 中引入,并且在 (这是 Squeak 的一个分支)和 Amber 中也可用。现在数组表达式创建了一个 Array,因此您必须为 #at: 消息使用整数。例如,dict at: 2 将返回一个关联 'bar'->'yellow',因为它位于您创建的数组的第二个位置。

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

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

    【讨论】:

      【解决方案2】:

      DictionaryAssociations 的集合。事实上,它是 Smalltalk 的标准关联集合。 (关联类的一个实例是一个键值对,其中的值可以是任何类的对象)。

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

      Dictionary 提供:
      removeKey: aKey . 删除密钥
      includesKey: aKey . 检查密钥是否存在
      includes: aValue . 检查值是否存在
      at:put: . 简写对于

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

      例如

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

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

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

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

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

      或者,更简洁,

      anAssociation := 'keyOfElement' -> 'valueOfElement'  
      

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

      【讨论】:

      • n.b. { } asDictionary 在 Squeak、Dolphin Smalltalk 或 Amber 中不受支持。它是一种特定于 Pharo 的便捷语法,至少从 Pharo 1.4 开始就可以使用。
      猜你喜欢
      • 2017-12-03
      • 2016-02-24
      • 2017-06-28
      • 2013-11-02
      • 2019-01-30
      • 2012-03-14
      • 2011-02-22
      • 1970-01-01
      • 2010-11-08
      相关资源
      最近更新 更多