[英]Print a SortedCollection to screen using keysAndValueDo (smalltalk)
您好,我正在学习并且是Smalltalk的新手,我正在尝试将我的SortedCollection打印到屏幕上以尝试使用keysAndValueDo,但我不确定这样做如何,如果有人可以给我一个通用的例子,那会很好
以下示例可用于Pharo Smalltalk,其他Smalltalk实现可能也类似。
首先,以现有的打印方法为例。 如果是SortedCollection
,则可以在其超类Collection
的printing
协议中找到它们。
您会发现元素的打印是在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" ]
我更喜欢有意义的局部变量名称,因此我将使用eachKey
和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
] .
将代码粘贴到工作区(从4.0版开始,在Pharo中称为Playground)。 选择文字。 选择后,右键单击(用两三个鼠标单击),然后从菜单中选择“执行”。 或使用Ctrl-d作为键盘快捷键。 (确切的和弦键可能会因您的平台而异)
最后的笔记
在SortedCollection或OrderedCollection中,键是索引。 该值是存储在element [index]处的值。
在字典中,元素的键是键,元素的值是值。
根据集合sort块的定义,SortedCollections按元素值的顺序排序 。 在没有自定义排序块的情况下,它们将以升序添加。 巧合'Third'
是, 'First'
, 'Second'
和'Third'
按字母顺序排列。 在此示例中,它工作得很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.