Smalltalk中的类型集合

时间:2009-10-03 17:40:25

标签: smalltalk

我正在尝试学习一些smalltalk编程....我正在尝试创建myClass类型的对象列表。最好的方法是什么?

我有以下内容:

| list |
list := OrderedCollection new.

如果我错了,请纠正我。

那么我应该如何在列表中添加元素呢?

2 个答案:

答案 0 :(得分:9)

要创建MyClass的新实例,请向该类发送消息#new

MyClass new

现在,要向集合添加元素,只需向集合发送消息#add:

list add: MyClass new

Smalltalk中没有静态类型。换句话说,相当于Java ArrayList< MyClass>只是OrderedCollection。

答案 1 :(得分:2)

在回答重点之前,强调Smalltalk没有强力打字。每个变量都是某个对象类的实例。但是对象类可以在对象的生命周期中经常更改,解释器和编译器都不关心。

在工作区中输入以下代码(或在#34; 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"

不会针对这些陈述提出任何警告或例外。

现在已经不在了,

  

我该如何在列表中添加元素?

这取决于您使用的列表类型。

Array是一个固定大小的整数索引列表。 OrderedCollection是可变大小的整数索引列表。 集合是唯一对象的集合。 字典是一组关联对象,即键值对 SortedCollection是一个对象列表,基于排序块定义进行排序。

他们每个人都有独特的添加项目的方法。

标准集合的最常用方法是 -
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'))