在 Smalltalk OrderedCollection 中打印元素时如何在元素之间添加空格?

How to add whitespace between elements when printing them out in Smalltalk OrderedCollection?

我已经创建了一个 OrderedCollection 列表,现在我想使用 Transcript 将其打印出来,如下所示:

  range do:[:each|Transcript show: each].

输出是 35791113,但我需要 3 5 7 9 11 13,所以我需要元素之间有空格。 我也试过了..

   Transcript show: range.

但是我不想使用这个 OrderedCollection(3 5 7 9 11 13),而是希望只有列表元素,而没有 OrderedCollection。 如何实现?

独立于方言的解决方案看起来像

| first |
first := true.
range do: [:each |
    first ifTrue: [frist := false] ifFalse: [Transcript show: ' '].
    Transcript show: each]

然而,每种方言都已经有办法做到这一点。例如,在 Pharo 中我们有 #do:separatedBy: 消息:

range do: [:each | Transcript show: each] separatedBy: [Transcript show: ' ']

您可能想要做的另一件事是使用 Transcript space 来获取

range do: [:each | Transcript show: each] separatedBy: [Transcript space]

此外,我会推荐一种更通用的方法,您可以将字符串表示形式转储到更通用的对象类型上,例如 WriteStream:

dump: range on: aStream
    range do: [:each | each printOn: aStream] separatedBye: [aStream space]

所以现在你可以简单地写

<receiver> dump: range on: Transcript

得到想要的结果。

Pharo 中你可以简单地做

Transcript show: (range joinUsing: ' ')

或相反

Transcript show: (' ' join: range)

即使元素是数字,这也有效。

GNU Smalltalk 中你需要更明确

Transcript show: ((range collect: [ :each | each asString ]) join: ' ')

最后你可以简单地扩展你已经尝试过的do:separatedBy:

range
    do: [ :each | Transcript show: each ]
    separatedBy: [ Transcript show: ' ' ]

在 Squeak、Pharo 和 Cuis 中你可以这样做

 #(3 5 7 9 11 13) do: [:each | Transcript show: each; space]

得到结果。