2014-06-06 278 views
1

我是Smalltalk的新手,在完成了所有主題的學習之後,我想我已經準備好開始我的項目了,但是當我開始學習時,我剛剛開始在嵌套for循環的時候遇到困難。確實搜索這個issiue,但互聯網上的例子並不符合我的需求,這很簡單,我只想得到循環的索引來使用它們。 也許這個話題將有助於我和即將啓動,多謝你代表我和他們:)嵌套循環Smalltalk

我不知道這是很容易找到的或可行的,但我試圖做

1 to: 25 do: [[:a |1 to: 80 do: [:b | a , b printString ,' '],cr]]. 

我只想連接數字爲

11 12 13 14 ..180 
21 22 23 ... 
. 
. 
251 252 ... 2580 

將它們用作索引或指針,然後將它們存儲在字典中。 但我只是不能做嵌套循環,至少寫出他們打印。

我使用Pharo 3.0如果你想知道。

回答

2

我不確定是否有比轉換爲字符串更好的方法。但是,如果你想要去的路線嘗試打印或在工作區檢查:

((1 to: 25) collect: [ :a | (1 to: 80) collect: [ :b | a printString , b printString ]]) flattened. 

隨着do: aBlock您評估ABLOCK對於接收機中的每一個元素,但
collect: aBlock收集每塊評價的結果在一個新的集合。

根據你打算做什麼,你可能不得不將結果字符串轉換回數字。

+1

感謝您表示過 – iRestMyCaseYourHonor

2

你的代碼工作正常(除了丟失#printString消息a和錯誤的嵌套嵌套),但@MartinW說,你沒有使用塊的返回值。你可以做什麼,而不是(保留儘可能多的你當前的代碼儘可能的)是這樣的(我喜歡在一個更明確的方式來編碼):

Transcript open. 
1 to: 25 do: [ :a | 
    1 to: 80 do: [ :b | 
     Transcript 
      show: a printString; 
      show: b printString; 
      show: ' ' ]. 
    Transcript cr ]. 
+1

的區別謝謝陳腳本打開部分也幫了我很多:) – iRestMyCaseYourHonor

1

一個Squeakish/Pharoish的方式來累積成從一個單一的集合嵌套循環是使用一箇中間流,像在這個片段:

String streamContents: [:aStream | 
    1 to: 25 do: [:a | 
     1 to: 80 do: [:b | 
      aStream 
       print: a; 
       print: b; 
       space]]]. 

或者,如果你想創建數量的數組:

Array new: 25*80 streamContents: [:aStream | 
    1 to: 25 do: [:a | 
     1 to: 80 do: [:b | 
      aStream nextPut: (a printString , b printString) asNumber]]]. 
+0

+1這是怎麼來的,特別是一個「吱吱聲/ Pharoish」的方式? – MartinW

+2

@MartinW使用流不是特別尖銳,但消息streamContents:和new:streamContents:是在Squeak中引入的。至少,它們在st80/Visualworks中不存在。我不知道它是否已經在VW或其他Smalltalk版本的最新版本中引入... –