Типовые коллекции в Smalltalk - PullRequest
2 голосов
/ 03 октября 2009

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

У меня есть следующее:

| list |
list := OrderedCollection new.

Поправь меня, если я ошибаюсь.

Так как мне добавить элементы в мой список?

Ответы [ 2 ]

9 голосов
/ 03 октября 2009

Для создания новых экземпляров MyClass отправьте классу сообщение # new

MyClass new

Теперь, чтобы добавить элемент в коллекцию, просто отправьте коллекции сообщение #add:

list add: MyClass new

В Smalltalk не существует статических типов. Другими словами, эквивалентом Java ArrayList является просто OrderedCollection.

2 голосов
/ 16 ноября 2015

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

Введите следующий код в рабочую область (или в «Playground» на Pharo 4.0 и выше, или в командной строке в GNU Smalltalk)

aNumber := 3 . "new instance of Class SmallInt is created"
aNumber := 22/7 . "aNumber is now an instance of Class Fraction"   
aNumber := 3.14159 . "aNumber is now an instance of Class Float"  
aNumber := 'Pi' . "aNumber is now an instance of Class ByteString"

Никаких предупреждений или исключений для любого из этих утверждений не будет.

Теперь это не так,

как мне добавить элементы в мой список?

Это зависит от типа используемого вами списка.

Массив - это индекс с целочисленным индексом фиксированного размера. OrderedCollection - это список с переменным размером целого индекса. Набор - это коллекция уникальных объектов. Словарь - это набор объектов ассоциации, то есть пары ключ-значение SortedCollection - это список объектов, отсортированных на основе определения sort .

Каждый из них имеет уникальные методы добавления предметов.

Наиболее распространенные методы для стандартных коллекций -
add: (недоступно для Array или String - поскольку у них не может быть изменено количество элементов после первоначального создания) at:put: (недоступно для Set, поскольку в действительности оно содержит только ключи, но не значения)

OrderedCollection также имеет addFirst:, add:after:, add:before:, add:beforeIndex:

Если вы отправляете сообщение о добавлении в коллекцию, но коллекция не понимает это конкретное сообщение, оно вызовет исключение.

Итак, для вашего list

| list newElement1 newElement2 newElement3 |
list := OrderedCollection new .
newElement1 := 'ABC' . "a ByteString"
newElement2 := 123 . "a SmallInt"
newElement3 := Dictionary new .
newElement3 at: 'Doh' put: 'A deer, a female deer' ;
            at: 'Ray' put: 'A drop of golden sun' ;
            at: 'So' put: 'A needle pulling thread' .
list add: newElement1 ;
     add: newElement2 ;
     add: newElement3 .

приведет к
list (an OrderedCollection) [3 items] ('ABC' 123 aDictionary [2 items] ( 'Doh'->'A deer, a female deer' 'Ray'->'A drop of golden sun'))

...