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 类以获取可能实现的更多消息。