簡體   English   中英

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

[英]Print a SortedCollection to screen using keysAndValueDo (smalltalk)

您好,我正在學習並且是Smalltalk的新手,我正在嘗試將我的SortedCollection打印到屏幕上以嘗試使用keysAndValueDo,但我不確定這樣做如何,如果有人可以給我一個通用的例子,那會很好

以下示例可用於Pharo Smalltalk,其他Smalltalk實現可能也類似。

  1. 首先,以現有的打印方法為例。 如果是SortedCollection ,則可以在其超類Collectionprinting協議中找到它們。

  2. 您會發現元素的打印是在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" ]

我更喜歡有意義的局部變量名稱,因此我將使用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
] .

將代碼粘貼到工作區(從4.0版開始,在Pharo中稱為Playground)。 選擇文字。 選擇后,右鍵單擊(用兩三個鼠標單擊),然后從菜單中選擇“執行”。 或使用Ctrl-d作為鍵盤快捷鍵。 (確切的和弦鍵可能會因您的平台而異)

最后的筆記
在SortedCollection或OrderedCollection中,鍵是索引。 該值是存儲在element [index]處的值。

在字典中,元素的鍵是鍵,元素的值是值。

根據集合sort塊的定義,SortedCollections按元素值的順序排序 在沒有自定義排序塊的情況下,它們將以升序添加。 巧合'Third'是, 'First''Second''Third'按字母順序排列。 在此示例中,它工作得很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM