2015-09-07 71 views
4

我想通過使用循環繪製一串符號。我這樣做的方式,但它總是吸引x圈...smalltalk中的循環內條件

1 to: x do: [ 
    (self lastWasSquare) 
      ifTrue: [ self drawCircle] 
      ifFalse: [ self drawSquare] 
] 

我也試過:

x timesRepeat: [ 
    (self lastWasSquare) 
      ifTrue: [ self drawCircle] 
      ifFalse: [ self drawSquare] 
]. 

但還是畫圓。我也嘗試通過在循環中添加一個:n |變量並詢問是否偶數,但是它總是執行循環代碼。 我在做什麼錯? 謝謝

+3

代碼對我來說似乎很好,當你不需要索引時'x timesRepeat:'更好。你能給我們其他三種方法的代碼嗎?您也可以嘗試將「自停止」作爲循環的第一條語句或條件塊內部的語句。這將作爲一個斷點,所以你可以檢查'last lastWasSquare'的結果是什麼,爲什麼它是這樣的等等 – Uko

+1

'self drawCircle'和'self drawSquare'執行一些副作用會導致'self lastWasSquare'給出不同的結果?不知道這些選擇器的代碼是做什麼的,不可能告訴你爲什麼你的代碼沒有按預期運行。 – lurker

回答

3

它看起來像您的來電self lastWasSquare不斷返回true讓您#ifTrue:ifFalse:不斷進入調用self drawCircle塊。您可以:

  1. 確保您drawCircledrawSquare方法正確設置你的lastWasSquare實例變量(至少我假定這只是一個getter方法)。
  2. 將最後繪製的項目是圓形還是方形的決定移動到臨時變量中。

第一種方法更好,如果您需要在正在處理的方法之外的任何地方使用lastWasSquare值。第二種方式是更好的,如果這就是你正在繪製圓形或正方形(保留範圍小,因爲它需要有),可以是這個樣子的唯一地方:

| lastWasSquare | 
lastWasSquare := false. 
x timesRepeat: [ 
    lastWasSquare 
     ifTrue: [ self drawCircle ] 
     ifFalse: [ self drawSquare ]. 
    lastWasSquare := lastWasSquare not 
]. 

所以你不斷地切換truefalse之間的lastWasSquare,它將繪製交替的形狀。 (我假設這就是當你說「畫一連串符號時你想達到的效果......」)

如果這些都不適用,那麼,正如Uko在評論中所說的那樣,你需要發佈更多的代碼,以便我們能夠爲您提供幫助。

+0

@lurker eek,絕對正確,謝謝...編輯。這就是我只需輸入它而不用在工作區中進行嘗試的結果。 ;-) –