繁体   English   中英

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

[英]Print a SortedCollection to screen using keysAndValueDo (smalltalk)

您好,我正在学习并且是Smalltalk的新手,我正在尝试将我的SortedCollection打印到屏幕上以尝试使用keysAndValueDo,但我不确定这样做如何,如果有人可以给我一个通用的例子,那会很好

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

  1. 首先,以现有的打印方法为例。 如果是SortedCollection ,则可以在其超类Collectionprinting协议中找到它们。

  2. 您会发现元素的打印是在printElementsOn:定义的。 因此,您可以在SortedCollection覆盖此方法。

这是一个printElementsOn:方法,该方法将按照您的要求使用keysAndValuesDo: ::

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

现在打印之前的收藏:

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

将打印:

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

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

为了确保每行显示文本之前都有换行符,我们将消息cr发送到“文字记录”

Transcript cr.
Transcript show: 'some text'.

一种速记方法可以使我们一次又一次地向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中的工作方式相同)。

关键字message 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
] .

将代码粘贴到工作区(从4.0版开始,在Pharo中称为Playground)。 选择文字。 选择后,右键单击(用两三个鼠标单击),然后从菜单中选择“执行”。 或使用Ctrl-d作为键盘快捷键。 (确切的和弦键可能会因您的平台而异)

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM