你好我正在学习并且是新手的smalltalk,我正在尝试打印我的SortedCollection屏幕试图使用keysAndValueDo但我不确定它是如何完成的,如果有人能给我一个很好的一般例子
答案 0 :(得分:4)
以下示例适用于Pharo Smalltalk,其他Smalltalk实现可能与此类似。
首先,以现有的打印方法为例。如果是SortedCollection
,您可以在其超类printing
的{{1}}协议中找到它们。
您会发现元素的打印在Collection
中定义。因此,您可以在printElementsOn:
。
以下是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"
]
我更喜欢有意义的本地变量名称,因此我会使用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
] .
将代码粘贴到工作区(Pharo中称为Playground,从4.0版开始)。选择文字。选择后,右键单击(在两个或三个按钮鼠标上)并选择"执行"从菜单中。或者使用Ctrl-d作为键盘快捷键。 (确切的和弦键可能会因您的平台而异)
最后的笔记
在SortedCollection或OrderedCollection中,键是索引。该值是存储在element [index]中的值。
在词典中,元素的键是键,元素的值是值。
根据集合排序块的定义,SortedCollections按元素值的顺序排序。如果没有自定义排序块,它们将按升序添加。巧合的是,'First'
,'Second'
和'Third'
按字母顺序排列。在这个例子中,它恰好很好用。