Распечатайте коллекцию SortedCollection на экране с помощью keysAndValueDo (smalltalk)
Здравствуйте, я учусь, и я новичок в smalltalk, и я пытаюсь распечатать коллекцию SortedCollection на экране, пытаясь использовать keysAndValueDo, но я не уверен, как это сделать, если кто-нибудь может дать мне общий пример, который был бы отличным
2 ответа
Часть 1 - Отображение на экран
Самый простой способ печати на экране в Smalltalk на основе графического интерфейса - это использовать сообщение:Transcript show: 'some text'
(Стенограмма - это системный объект, который отображается в прокручиваемом окне).
Чтобы убедиться, что перед каждой строкой отображаемого текста стоит новая строка, мы отправляем сообщение cr
к стенограмме
Transcript cr.
Transcript show: 'some text'.
Сокращенный метод, который спасает нас от повторного набора Transcript
снова и снова, чтобы послать Transcript серию сообщений одно за другим. Это называется каскадом сообщений. Каждый раз, когда мы заканчиваем сообщение в ;
это означает отправку тому же получателю, на который было отправлено последнее сообщение.
Затем мы можем сократить это снова, поскольку Smalltalk не обращает внимания на переводы строк в выражениях.
Конечный каскад отображаемых сообщений становится:Transcript cr; show: 'some text'.
Часть 2. Перечисление aSortedCollection с использованием keysAndValuesDo: это сообщение с ключевым словом SequencableCollection и заголовок его метода:keysAndValuesDo: aBlock
"Enumerate the receiver with all the keys (aka indices) and values."
(Это работает так же в Dolphin, и в Squeak и его производных, Pharo и Cuis).
Ключевое сообщение keysAndValuesDo:
принимает аргумент блока.
Блок - это анонимный объект с одним методом. Его метод определен между соответствующей парой квадратных скобок - [
... ]
пара.
В этом случае нам нужна локальная переменная в блоке для ключа каждого элемента коллекции и другая локальная переменная для значения каждого элемента.
Мы можем называть их как угодно, и в этом случае важен порядок, в котором они появляются. keysAndValuesDo:
поместит ключ элемента в первую локальную переменную в блоке и поместит значение элемента во вторую локальную переменную в блоке.
Локальные переменные в блоке объявляются в начале блока, и каждое имя переменной идентифицируется путем добавления к нему префикса :
, Объявления локальных переменных заканчиваются |
,
Блок выглядит так[:local1 :local2 |
"do something for each element, with the key in local1 and the value in local2"
]
Я предпочитаю значимые имена локальных переменных, поэтому я буду использовать eachKey
а также eachValue
,
Часть 3: Собираем все вместе
Перечислять через mySortedCollection
"Declare the mySortedCollection variable"
|mySortedCollection|
"Initialise the collection"
mySortedCollection := SortedCollection new.
"add in some data to the collection"
mySortedCollection add: ('First') ;
add: ('Second') ;
add: ('Third').
"Enumerate through the collection, displaying to the Transcript window"
mySortedCollection keysAndValuesDo:
[:eachKey :eachValue |
Transcript cr; show: eachKey; show: ' '; show: eachValue
] .
Вставьте код в рабочую область (известную как игровая площадка в Pharo, начиная с версии 4.0). Выберите текст. После выбора щелкните правой кнопкой мыши (на кнопку с двумя или тремя кнопками) и выберите "Сделать это" из меню. Или используйте Ctrl-d в качестве сочетания клавиш. (Точный ключ записи зависит от вашей платформы)
Финальные заметки
В SortedCollection или OrderedCollection ключом является индекс. Значение - это то, что хранится в элементе [index].
В словаре ключом элемента является ключ, а значением элемента является значение.
SortedCollections сортируются в порядке значений элементов в соответствии с определением блока сортировки коллекций. При отсутствии пользовательского блока сортировки они будут добавляться в порядке возрастания. 'First'
, 'Second'
а также 'Third'
по совпадению, в алфавитном порядке. Это получается хорошо в этом примере.
Следующий пример работает с Pharo Smalltalk, другая реализация Smalltalk может работать аналогично.
Сначала рассмотрим существующие методы печати в качестве примеров. В случае
SortedCollection
вы найдете их вprinting
протокол его суперклассаCollection
,Вы обнаружите, что печать элементов определяется в
printElementsOn:
, Таким образом, вы можете переписать этот метод вSortedCollection
,
Вот printElementsOn:
метод, который будет использовать keysAndValuesDo:
, как вы просили:
printElementsOn: aStream
aStream nextPut: $(.
self keysAndValuesDo: [:key :value |
aStream
nextPut: $(;
print: key;
nextPut: $:;
space;
print: value;
nextPut: $)].
aStream nextPut: $)
Теперь коллекция, которая раньше печаталась:
"Сортированная коллекция (1 2 3 3 5 10)"
напечатает:
"Сортированная коллекция ((1: 1)(2: 2)(3: 3)(4: 3)(5: 5)(6: 10))"