使用 keysAndValueDo (smalltalk) 将 SortedCollection 打印到屏幕
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: $)
现在打印之前的合集:
"a SortedCollection(1 2 3 3 5 10)"
将打印:
"a SortedCollection((1: 1)(2: 2)(3: 3)(4: 3)(5: 5)(6: 10))"
第 1 部分 - 在屏幕上显示
在基于 GUI 的 Smalltalk 中打印到屏幕的最直接的方法是使用消息:
Transcript show: 'some text'
(成绩单是一个系统对象,显示为可滚动的 window)。
为了确保在每行显示文本之前有一个换行符,我们将消息 cr
发送到 Transcript
Transcript cr.
Transcript show: 'some text'.
一个 shorthand 方法,可以避免我们一遍又一遍地重新输入 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 中称为游乐场,从 4.0 版开始)。 Select正文。 selected 后,右键单击(在两键或三键鼠标上)并从菜单中单击 select "Do it"。或者使用 Ctrl-d 作为键盘快捷键。 (确切的和弦键可能因您的平台而异)
最后的笔记
在 SortedCollection 或 OrderedCollection 中,键是索引。该值是存储在 element[index].
中的值
在字典中,元素的键是键,元素的值是值。
SortedCollections 根据集合排序块 的定义,按元素值的顺序排序。在没有自定义排序块的情况下,它们将按升序添加。巧合的是,'First'
、'Second'
和 'Third'
按字母顺序排列。恰好在这个例子中效果很好。
你好,我正在学习,我是 smalltalk 的新手,我正在尝试将我的 SortedCollection 打印到屏幕上,尝试使用 keysAndValueDo,但我不确定它是如何完成的,如果有人能给我一个通用的例子,那就太好了
以下示例适用于 Pharo Smalltalk,其他 Smalltalk 实现可能会类似。
首先,以现有的打印方法为例。在
SortedCollection
的情况下,您可以在其超类Collection
. 的 你会发现元素的打印是在
printElementsOn:
中定义的。所以你可以在SortedCollection
. 中覆盖这个方法
printing
协议中找到它们
这是一个 printElementsOn:
方法,它将使用 keysAndValuesDo:
,正如您所要求的:
printElementsOn: aStream
aStream nextPut: $(.
self keysAndValuesDo: [:key :value |
aStream
nextPut: $(;
print: key;
nextPut: $:;
space;
print: value;
nextPut: $)].
aStream nextPut: $)
现在打印之前的合集:
"a SortedCollection(1 2 3 3 5 10)"
将打印:
"a SortedCollection((1: 1)(2: 2)(3: 3)(4: 3)(5: 5)(6: 10))"
第 1 部分 - 在屏幕上显示
在基于 GUI 的 Smalltalk 中打印到屏幕的最直接的方法是使用消息:
Transcript show: 'some text'
(成绩单是一个系统对象,显示为可滚动的 window)。
为了确保在每行显示文本之前有一个换行符,我们将消息 cr
发送到 Transcript
Transcript cr.
Transcript show: 'some text'.
一个 shorthand 方法,可以避免我们一遍又一遍地重新输入 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 中称为游乐场,从 4.0 版开始)。 Select正文。 selected 后,右键单击(在两键或三键鼠标上)并从菜单中单击 select "Do it"。或者使用 Ctrl-d 作为键盘快捷键。 (确切的和弦键可能因您的平台而异)
最后的笔记
在 SortedCollection 或 OrderedCollection 中,键是索引。该值是存储在 element[index].
在字典中,元素的键是键,元素的值是值。
SortedCollections 根据集合排序块 的定义,按元素值的顺序排序。在没有自定义排序块的情况下,它们将按升序添加。巧合的是,'First'
、'Second'
和 'Third'
按字母顺序排列。恰好在这个例子中效果很好。