0

您好,我正在学习并且是 smalltalk 的新手,我正在尝试将我的 SortedCollection 打印到屏幕上尝试使用 keysAndValueDo 但我不确定它是如何完成的,如果有人能给我一个很好的一般示例

4

2 回答 2

4

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

  1. 首先,以现有的打印方法为例。在这种情况下,您可以在其超类的协议中SortedCollection找到它们。printingCollection

  2. 您会发现元素的打印定义在printElementsOn:. 所以你可以在SortedCollection.

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

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

现在是一个之前打印的集合:

“一个排序集合(1 2 3 3 5 10)”

将打印:

“一个 SortedCollection((1:1)(2:2)(3:3)(4:3)(5:5)(6:10))”

于 2015-11-15T10:39:58.077 回答
4

第 1 部分 - 显示到
屏幕 在基于 GUI 的 Smalltalk 中打印到屏幕的最直接方法是使用以下消息:
Transcript show: 'some text'
(Transcript 是显示到可滚动窗口中的系统对象)。

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

Transcript cr.
Transcript show: 'some text'.

一种可以省去我们一遍又一遍地重新输入的速记方法Transcript是一个接一个地发送 Transcript 一系列消息。这称为消息级联。每次我们在其中结束消息时,;都意味着发送到与上一条消息发送到相同的接收者

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

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

第 2 部分:使用keysAndValuesDo 枚举SortedCollection: 这个关键字消息是SequenceCollection,它的方法头是:
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" ]

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

第 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 中称为 Playground,从 4.0 版开始)。选择文本。选择后,右键单击(在两键或三键鼠标上)并从菜单中选择“执行”。或者使用 Ctrl-d 作为键盘快捷键。(确切的和弦键可能因您的平台而异)

最后说明
在 SortedCollection 或 OrderedCollection 中,键是索引。该值存储在 element[index] 中。

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

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

于 2015-11-17T00:06:07.560 回答