| dict |
dict := #{'foo'->'brown'. 'bar'->'yellow'.
'qix'->'white'. 'baz'->'red'. 'flub'->'green'} asDictionary.
dict at: 'qix'
如果我PrintIt
,我会得到“白色”。如果我删除“asDictionary”,我仍然会得到“白色”。字典给了我什么是关联集合没有的?
| dict |
dict := #{'foo'->'brown'. 'bar'->'yellow'.
'qix'->'white'. 'baz'->'red'. 'flub'->'green'} asDictionary.
dict at: 'qix'
如果我PrintIt
,我会得到“白色”。如果我删除“asDictionary”,我仍然会得到“白色”。字典给了我什么是关联集合没有的?
表达式 like#{exp1 . sxp2 . exp3}
是amber-smalltalk特定的并创建一个HashedCollection,这是一种特殊的字典,其中键是字符串(可能在 Javascript 中你经常使用这样的东西)。
在其他小谈话中,没有这样的表达方式。相反,数组表达式看起来像:({exp1 . sxp2 . exp3}
没有前导#
)是在squeak中引入的,并且在pharo(它是 Squeak 的一个分支)和 Amber中也可用。现在数组表达式创建了一个数组,因此您必须使用整数作为#at:
消息。例如dict at: 2
,将返回一个关联'bar'->'yellow'
,因为它位于您创建的数组的第二个位置。
#asDictionary
是集合的一种方法,如果集合的元素是关联,则将其转换为字典。所以如果你想用字符串以外的键创建一个字典,你可以这样做:
dict := {
'foo' -> 'brown' .
1 -> 'yellow' .
3 @ 4 -> 'white' .
#(1 2) -> 'red' } asDictionary
ADictionary
是s的集合Association
。事实上,它是 Smalltalk 的标准关联集合。(关联类的一个实例是一个键值对,其中的值可以是任何类的对象)。
Dictionary 为您提供的优势在于,与您可能想要使用的其他 Collections 相比,它具有处理关联的专门方法。
ADictionary
提供:
removeKey: aKey .
删除 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'
如果你想使用完全由Symbol
s 制成的键,还有Class
IdentityDictionary