使用 keysAndValueDo (smalltalk) 将 SortedCollection 打印到屏幕

Print a SortedCollection to screen using keysAndValueDo (smalltalk)

你好,我正在学习,我是 smalltalk 的新手,我正在尝试将我的 SortedCollection 打印到屏幕上,尝试使用 keysAndValueDo,但我不确定它是如何完成的,如果有人能给我一个通用的例子,那就太好了

以下示例适用于 Pharo Smalltalk,其他 Smalltalk 实现可能会类似。

  1. 首先,以现有的打印方法为例。在 SortedCollection 的情况下,您可以在其超类 Collection.

  2. printing 协议中找到它们
  3. 你会发现元素的打印是在printElementsOn:中定义的。所以你可以在 SortedCollection.

  4. 中覆盖这个方法

这是一个 printElementsOn: 方法,它将使用 keysAndValuesDo:,正如您所要求的:

printElementsOn: aStream
    aStream nextPut: $(.
    self keysAndValuesDo: [:key :value | 
        aStream
            nextPut: $(;
            print: key;
            nextPut: $:;
            space;
            print: value;
            nextPut: $)].
    aStream nextPut: $)

现在打印之前的合集:

"a SortedCollection(1 2 3 3 5 10)"

将打印:

"a SortedCollection((1: 1)(2: 2)(3: 3)(4: 3)(5: 5)(6: 10))"

第 1 部分 - 在屏幕上显示
在基于 GUI 的 Smalltalk 中打印到屏幕的最直接的方法是使用消息:
Transcript show: 'some text'
(成绩单是一个系统对象,显示为可滚动的 window)。

为了确保在每行显示文本之前有一个换行符,我们将消息 cr 发送到 Transcript

Transcript cr.
Transcript show: 'some text'.

一个 shorthand 方法,可以避免我们一遍又一遍地重新输入 Transcript,就是一个接一个地发送 Transcript 一系列消息。这称为 消息级联 。每次我们在 ; 中结束一条消息,这意味着 发送给与上一条消息发送给相同的接收者

然后我们可以再次缩短它,因为 Smalltalk 不注意表达式中的换行符。

最终显示消息级联变为:
Transcript cr; show: 'some text'.

第 2 部分:使用 keysAndValuesDo 枚举 aSortedCollection: 这个关键字消息是 SequencableCollection,它的方法头是:
keysAndValuesDo: aBlock "Enumerate the receiver with all the keys (aka indices) and values."

(它在 Dolphin、Squeak 及其衍生产品 Pharo 和 Cuis 中的工作方式相同)。

关键字消息 keysAndValuesDo: 采用块参数。
块是一个匿名对象,只有一个方法。它的方法定义在一对匹配的方括号之间 - [ ... ] 对。

在这种情况下,我们需要在块中为集合中每个元素的键设置一个局部变量,并为每个元素的值设置另一个局部变量。

我们可以随意称呼它们,在这种情况下,它们出现的顺序很重要。 keysAndValuesDo: 会将元素的键放入块中的第一个局部变量,并将元素的值放入块中的第二个局部变量。

块中的局部变量在块的开头声明,每个变量名通过前缀 : 来标识。局部变量声明以 | 结尾。

方块看起来像
[:local1 :local2 | "do something for each element, with the key in local1 and the value in local2" ]

我更喜欢有意义的局部变量名,所以我将使用 eachKeyeachValue

第 3 部分:将它们放在一起
通过 mySortedCollection

来枚举
"Declare the mySortedCollection variable"
|mySortedCollection| 

"Initialise the collection"
mySortedCollection := SortedCollection new.  

"add in some data to the collection"
mySortedCollection add: ('First') ;
                   add: ('Second') ;
                   add: ('Third').

"Enumerate through the collection, displaying to the Transcript window"
mySortedCollection keysAndValuesDo: 
   [:eachKey :eachValue | 
    Transcript cr; show: eachKey; show: ' '; show: eachValue
] .

将代码粘贴到工作区(在 Pharo 中称为游乐场,从 4.0 版开始)。 Select正文。 selected 后,右键单击(在两键或三键鼠标上)并从菜单中单击 select "Do it"。或者使用 Ctrl-d 作为键盘快捷键。 (确切的和弦键可能因您的平台而异)

最后的笔记
在 SortedCollection 或 OrderedCollection 中,键是索引。该值是存储在 element[index].

中的值

在字典中,元素的键是键,元素的值是值。

SortedCollections 根据集合排序块 的定义,按元素值的顺序排序。在没有自定义排序块的情况下,它们将按升序添加。巧合的是,'First''Second''Third' 按字母顺序排列。恰好在这个例子中效果很好。