2015-06-05 3 views
4
| dict | 
dict := #{'foo'->'brown'. 'bar'->'yellow'. 
      'qix'->'white'. 'baz'->'red'. 'flub'->'green'} asDictionary. 
dict at: 'qix' 

Если я PrintIt, я получаю «белый». Если я удалю «asDictionary», я все равно получаю «белый». Что словарь дает мне, что коллекция ассоциаций нет?В чем разница между коллекцией ассоциаций и словарем в Smalltalk?

ответ

7

Выражение как #{exp1 . sxp2 . exp3} является специфичны и создает HashedCollection, который представляет собой особый вид словаря, где ключи являются строками (возможно, в JavaScript, вы используете такие вещи, как это много).

В других небольших тонах нет такого выражения. Вместо этого выражения массива выглядят так: {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 
+0

Я использую Янтарь. –

+0

@RichardEng обновил мой ответ – Uko

2

Dictionaryявляется коллекция Association с. Это, по сути, канонический сборник Smalltalk ассоциаций. (Экземпляр класса Association - это пара ключевых значений, где значение может быть объектом любого класса).

Преимущество, которое дает вам Словарь:, что у него есть специализированные методы для общения с Ассоциациями по сравнению с другими Коллекциями, которые могут возникнуть у вас искушения использовать.

Dictionary обеспечивает:
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 будет перезаписывать предварительно установленное значение с новым значением, поэтому очень важно, чтобы проверить и убедиться, что ключ имеет уникальное значение при добавлении новых элементов.

И ключ, и значение могут быть экземпляром объекта любого класса. Каждая ассоциация в словаре может быть любым видом объекта, и каждый отдельный ключ и значение могут быть экземпляром другого класса объекта из любого другого элемента в словаре.

Вы можете создать ассоциацию по

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

или, более кратко,

anAssociation := 'keyOfElement' -> 'valueOfElement' 

Если вы хотите использовать ключи полностью сделаны специально для Symbol с, есть также ClassIdentityDictionary

+0

n.b. '{} asDictionary' не поддерживается в Squeak, Dolphin Smalltalk или Amber. Это специальный синтаксис, специфичный для Pharo, и работает, по крайней мере, с Pharo 1.4 вверх. –