smalltalk中循环内的条件

smalltalk中循环内的条件,smalltalk,pharo,Smalltalk,Pharo,我试着用一个循环画一系列符号。我是这样做的,但它总是画x圈 1 to: x do: [ (self lastWasSquare) ifTrue: [ self drawCircle] ifFalse: [ self drawSquare] ] 我还尝试: x timesRepeat: [ (self lastWasSquare) ifTrue: [ self drawCircle]

我试着用一个循环画一系列符号。我是这样做的,但它总是画
x

1 to: x do: [
    (self lastWasSquare)
            ifTrue: [ self drawCircle]
            ifFalse: [ self drawSquare]
]
我还尝试:

x timesRepeat: [ 
    (self lastWasSquare)
            ifTrue: [ self drawCircle]
            ifFalse: [ self drawSquare]
]. 
但仍在画圈。我还试图通过向循环中添加一个
:n |
变量,并询问是否偶数,但同样,它总是执行循环代码来实现这一点。 我做错了什么?
谢谢你

看起来你对
self lastwasquare
的调用一直在返回
true
,因此你的
#ifTrue:ifFalse:
一直进入调用
self drawCircle
的块。您可以:

  • 确保
    drawCircle
    drawSquare
    方法正确设置了
    lastwasquare
    实例变量(至少我假设这只是一个getter方法)
  • 将最后绘制的项目是圆还是正方形的决定移到临时变量中
  • 如果您在所使用的方法之外的任何位置都需要
    lastwasquare
    值,那么第一种方法会更好。第二种方法更好,如果它是您绘制圆或正方形的唯一位置(保持范围尽可能小),并且可能看起来像这样:

    | lastWasSquare |
    lastWasSquare := false.
    x timesRepeat: [ 
        lastWasSquare
            ifTrue: [ self drawCircle ]
            ifFalse: [ self drawSquare ].
        lastWasSquare := lastWasSquare not
    ].
    
    因此,您不断在
    true
    false
    之间切换
    lastwasquare
    ,它将绘制交替的形状。(我假设当你说“画一条符号链”时,这就是你想要达到的目标…)


    如果两者都不适用,那么,正如Uko在评论中所说,您需要发布更多的代码,以便我们能够帮助您。

    代码对我来说似乎很好,而且
    x timesRepeat:
    在您不需要索引时更好。你能告诉我们其他三种方法的代码吗?您还可以尝试将
    self-halt
    作为循环的第一条语句,或放在条件块内部。这将作为一个断点,因此您可以检查
    self-lastwasquare
    的结果是什么,为什么会是这样,然后
    self-drawCircle
    self-drawSquare
    执行一些副作用,这将导致
    self-lastwasquare
    给出不同的结果?如果不知道这些选择器的代码是做什么的,就不可能告诉您为什么您的代码没有按预期运行。@Lowerer eek,绝对正确,谢谢。。。编辑。这就是我在没有在工作区中实际尝试的情况下直接输入的结果