Smalltalk 中的循环
对于此示例,将使用 Ordered Collection
来显示可以发送到 OrderedCollection
对象以循环遍历元素的不同消息。
下面的代码将使用消息 new
实例化一个空的 OrderedCollection
,然后使用消息 add:
用 4 个数字填充它
anOrderedCollection := OrderedCollection new.
anOrderedCollection add: 1; add: 2; add: 3; add: 4.
所有这些消息都将块作为参数,将为集合中的每个元素进行评估。
-
do:
这是基本的枚举消息。例如,如果我们想要打印集合中的每个元素,我们可以这样实现:anOrderedCollection do:[:each | Transcript show: each]. "Prints --> 1234"
集合中的每个元素都将使用以下语法定义为用户希望:
:each
此do:
循环将集合中的每个元素打印到Transcript
窗口。 -
collect:
collect:
消息允许你为集合中的每个项目执行某些操作,并将操作结果放入新集合中
。例如,如果我们想将集合中的每个元素乘以 2 并将其添加到新集合中,我们可以使用collect:
消息:evenCollection := anOrderedCollection collect:[:each | each*2]. "#(2 4 6 8)"
-
select:
select:
消息允许你创建一个子集合,其中根据某些条件为他们选择原始集合中的项目。例如,如果我们想从我们的集合中创建一个新的奇数集合,我们可以使用select:
消息:oddCollection := anOrderedCollection select:[:each | each odd].
由于
each odd
返回一个布尔值,只有使布尔返回 true 的元素才会被添加到oddCollection
,这将有#(1 3)
。 -
reject:
此消息与select:
相反,并拒绝任何使布尔返回true
的元素。或者,换句话说,它将选择使布尔返回false
的任何元素。例如,如果我们想像前面的例子一样构建相同的oddCollection
。我们可以使用reject:
:oddCollection := anOrderedCollection reject:[:each | each even].
oddCollection
将再次以#(1 3)
为其元素。
这些是 Smalltalk 中的四种基本枚举技术。但是,你可以随意浏览 Collections
类以获取可能实现的更多消息。