我正在尝试学习一些 smalltalk 编程……我正在尝试创建一个 myClass 类型的对象列表。最好的方法是什么?
我有以下内容:
| list |
list := OrderedCollection new.
如我错了请纠正我。
那么我应该如何将元素添加到我的列表中呢?
我正在尝试学习一些 smalltalk 编程……我正在尝试创建一个 myClass 类型的对象列表。最好的方法是什么?
我有以下内容:
| list |
list := OrderedCollection new.
如我错了请纠正我。
那么我应该如何将元素添加到我的列表中呢?
要创建 MyClass 的新实例,请向类发送消息 #new
MyClass new
现在,要将元素添加到集合中,只需向集合发送消息#add:
list add: MyClass new
Smalltalk 中没有静态类型之类的东西。换句话说,Java ArrayList<MyClass> 的等价物就是 OrderedCollection。
在回答之前,重要的是要强调 Smalltalk 中没有强类型。每个变量都是某个对象类的一个实例。但是对象的类可以在对象的生命周期中频繁更改,解释器和编译器都不会关心。
将以下代码输入到工作区(或在 Pharo 4.0 及更高版本的“Playground”中,或在 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 是可变大小的整数索引列表。集合是唯一对象的集合。Dictionary 是一组关联对象,即键值对 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'))