[英]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.