2015-11-15 54 views
0

您好,我學習,是新的smalltalk和我試圖打印我的SortedCollection屏幕試圖使用keysAndValueDo但我不知道如何完成它,如果任何人可以給我是一個很好的例子打印SortedCollection使用keysAndValueDo(smalltalk)

+3

你可以發佈你的代碼並描述你看到的錯誤嗎?查看[問]和[mcvc],然後編輯您的問題。 –

+0

你正在使用哪個Smalltalk實現? – MartinW

回答

4

部分1 - 顯示在屏幕上
最直接的方式打印到屏幕在一個基於GUI的Smalltalk是使用消息:
Transcript show: 'some text'
(轉錄物被顯示爲可滾動的窗口的系統對象) 。

要確保有顯示文本的每一行之前有一個換行符,我們發送消息cr談話

Transcript cr. 
Transcript show: 'some text'. 

的快捷方法,可以節省我們重新輸入一遍又一遍Transcript,是一個接一個地發送抄本一系列消息。這被稱爲消息級聯。每次我們在;結束消息時,這意味着發送到同一個接收器,因爲最後一條消息發送到

然後,我們可以再次縮短這一點,因爲Smalltalk不關注表達式中的換行符。

最終顯示消息級聯變爲:
Transcript cr; show: 'some text'.

第2部分:枚舉aSortedCollection使用keysAndValuesDo: 此關鍵字消息是SequencableCollectionand其方法的標題是:
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 
] . 

枚舉代碼到一個工作區粘貼(已知爲在一個菲羅遊樂場,從版本4.0以上)。選擇文字。選擇後,右鍵單擊(在兩個或三個按鈕上),然後從菜單中選擇「執行」。或者使用Ctrl-d作爲鍵盤快捷鍵。 (確切的和絃鍵可能你的平臺上會發生變化)

最後說明
在SortedCollection或OrderedCollection,關鍵是指數。該值是存儲在元素[index]處的值。

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

SortedCollections按照元素值的順序排序,根據集合的定義排序塊。在沒有自定義排序塊的情況下,它們將按升序添加。巧合地,'First','Second''Third'按字母順序排列。在這個例子中,它恰好可以很好地工作。

4

下面的例子適用於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)「

will print:

「一個SortedCollection((1:1)(2:2)(3:3)(4:3)(5:5)(6:10))」