Smalltalk 中的关联集合和字典有什么区别?
What is the difference between a collection of associations and a dictionary in Smalltalk?
| dict |
dict := #{'foo'->'brown'. 'bar'->'yellow'.
'qix'->'white'. 'baz'->'red'. 'flub'->'green'} asDictionary.
dict at: 'qix'
如果我PrintIt
,我得到'white'。如果我删除 'asDictionary',我仍然得到 'white'。什么是字典能给我而一堆联想不能给我的?
像 #{exp1 . sxp2 . exp3}
这样的表达式是 amber-smalltalk 特定的并创建一个 HashedCollection,这是一种特殊的字典,其中键是字符串(可能在 Javascript 你经常使用这样的东西。
在其他的smalltalks中是没有这样的表达的。相反,数组表达式看起来像:{exp1 . sxp2 . exp3}
(没有前导 #
)在 squeak and are also available in pharo(Squeak 的一个分支)和 Amber 中被引入。现在,数组表达式创建了一个 Array,因此您必须对 #at:
消息使用整数。例如 dict at: 2
会 return 你一个关联 'bar'->'yellow'
因为它在你创建的数组的第二个位置。
#asDictionary
是集合的一种方法,它把它转换成字典,因为集合的元素是关联的。所以如果你想用字符串以外的键创建一个字典,你可以这样做:
dict := {
'foo' -> 'brown' .
1 -> 'yellow' .
3 @ 4 -> 'white' .
#(1 2) -> 'red' } asDictionary
一个Dictionary
是一个Association
的集合。实际上,它是 Smalltalk 规范的关联集合。 (Association的一个实例Class是一个键值对,其中的值可以是任何Class的对象)。
字典给你的优势是与你可能想使用的其他集合相比,它有处理关联的专门方法。
A Dictionary
提供:
removeKey: aKey .
删除一个密钥
includesKey: aKey .
检查密钥是否存在
includes: aValue .
检查值是否存在
at:put: .
shorthand 对于
anAssociation := Association key:value: .
aDictionary add:
例如
anAssociation := Association key: 'Hello'
value: 'A greeting people often use' .
aDictionary add: anAssociation .
如果键已经存在于字典中,那么at:put
会用新值覆盖先前存在的值,所以在添加新值时检查并确保键具有唯一值很重要项目。
键和值都可以是任何Class的对象实例。字典中的每个关联都可以是任何类型的对象,并且每个键和值都可以是与字典中每个其他元素不同的 Class 对象的实例。
您可以通过
创建协会
anAssociation := Association key: 'keyOfElement' value: 'valueOfElement'
或者,更简洁地说,
anAssociation := 'keyOfElement' -> 'valueOfElement'
如果你想使用完全由 Symbol
s 制成的键,还有 Class
IdentityDictionary
| dict |
dict := #{'foo'->'brown'. 'bar'->'yellow'.
'qix'->'white'. 'baz'->'red'. 'flub'->'green'} asDictionary.
dict at: 'qix'
如果我PrintIt
,我得到'white'。如果我删除 'asDictionary',我仍然得到 'white'。什么是字典能给我而一堆联想不能给我的?
像 #{exp1 . sxp2 . exp3}
这样的表达式是 amber-smalltalk 特定的并创建一个 HashedCollection,这是一种特殊的字典,其中键是字符串(可能在 Javascript 你经常使用这样的东西。
在其他的smalltalks中是没有这样的表达的。相反,数组表达式看起来像:{exp1 . sxp2 . exp3}
(没有前导 #
)在 squeak and are also available in pharo(Squeak 的一个分支)和 Amber 中被引入。现在,数组表达式创建了一个 Array,因此您必须对 #at:
消息使用整数。例如 dict at: 2
会 return 你一个关联 'bar'->'yellow'
因为它在你创建的数组的第二个位置。
#asDictionary
是集合的一种方法,它把它转换成字典,因为集合的元素是关联的。所以如果你想用字符串以外的键创建一个字典,你可以这样做:
dict := {
'foo' -> 'brown' .
1 -> 'yellow' .
3 @ 4 -> 'white' .
#(1 2) -> 'red' } asDictionary
一个Dictionary
是一个Association
的集合。实际上,它是 Smalltalk 规范的关联集合。 (Association的一个实例Class是一个键值对,其中的值可以是任何Class的对象)。
字典给你的优势是与你可能想使用的其他集合相比,它有处理关联的专门方法。
A Dictionary
提供:
removeKey: aKey .
删除一个密钥
includesKey: aKey .
检查密钥是否存在
includes: aValue .
检查值是否存在
at:put: .
shorthand 对于
anAssociation := Association key:value: .
aDictionary add:
例如
anAssociation := Association key: 'Hello'
value: 'A greeting people often use' .
aDictionary add: anAssociation .
如果键已经存在于字典中,那么at:put
会用新值覆盖先前存在的值,所以在添加新值时检查并确保键具有唯一值很重要项目。
键和值都可以是任何Class的对象实例。字典中的每个关联都可以是任何类型的对象,并且每个键和值都可以是与字典中每个其他元素不同的 Class 对象的实例。
您可以通过
创建协会anAssociation := Association key: 'keyOfElement' value: 'valueOfElement'
或者,更简洁地说,
anAssociation := 'keyOfElement' -> 'valueOfElement'
如果你想使用完全由 Symbol
s 制成的键,还有 Class
IdentityDictionary