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

时间:2015-11-15 06:42:27

标签: smalltalk sortedcollection

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

2 个答案:

答案 0 :(得分:4)

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

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

  2. 您会发现元素的打印在Collection中定义。因此,您可以在printElementsOn:

  3. 中覆盖此方法

    以下是SortedCollection方法,将使用printElementsOn:,正如您所要求的那样:

    keysAndValuesDo:

    现在打印前的一个集合:

      

    “a SortedCollection(1 2 3 3 5 10)”

    将打印:

      

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

答案 1 :(得分:4)

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

为确保每行显示文字前都有换行符,我们会将短信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中的工作方式相同)。

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

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

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

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