Smalltalk 中的循环

对于此示例,将使用 Ordered Collection 来显示可以发送到 OrderedCollection 对象以循环遍历元素的不同消息。
下面的代码将使用消息 new 实例化一个空的 OrderedCollection,然后使用消息 add:用 4 个数字填充它

anOrderedCollection := OrderedCollection new.
anOrderedCollection add: 1; add: 2; add: 3; add: 4.

所有这些消息都将块作为参数,将为集合中的每个元素进行评估。

  1. do:
    这是基本的枚举消息。例如,如果我们想要打印集合中的每个元素,我们可以这样实现:

    anOrderedCollection do:[:each | Transcript show: each]. "Prints --> 1234"
    

    集合中的每个元素都将使用以下语法定义为用户希望::eachdo:循环将集合中的每个元素打印到 Transcript 窗口。

  2. collect:
    collect:消息允许你为集合中的每个项目执行某些操作,并将操作结果放入新集合中
    。例如,如果我们想将集合中的每个元素乘以 2 并将其添加到新集合中,我们可以使用 collect:消息:

    evenCollection := anOrderedCollection collect:[:each | each*2]. "#(2 4 6 8)"
    
  3. select:
    select:消息允许你创建一个子集合,其中根据某些条件为他们选择原始集合中的项目。例如,如果我们想从我们的集合中创建一个新的奇数集合,我们可以使用 select:消息:

    oddCollection := anOrderedCollection select:[:each | each odd].
    

    由于 each odd 返回一个布尔值,只有使布尔返回 true 的元素才会被添加到 oddCollection,这将有 #(1 3)

  4. reject:
    此消息与 select:相反,并拒绝任何使布尔返回 true 的元素。或者,换句话说,它将选择使布尔返回 false 的任何元素。例如,如果我们想像前面的例子一样构建相同的 oddCollection。我们可以使用 reject:

    oddCollection := anOrderedCollection reject:[:each | each even].
    

    oddCollection 将再次以 #(1 3) 为其元素。

这些是 Smalltalk 中的四种基本枚举技术。但是,你可以随意浏览 Collections 类以获取可能实现的更多消息。