【问题标题】:How to "continue" in a loop in smalltalk如何在 smalltalk 中循环“继续”
【发布时间】:2019-05-10 18:41:51
【问题描述】:

如果 i 小于 5,我想“继续”以下代码:

1 to: 10 do: [ :i |
    i < 5 ifTrue: [ continue ].
    'Square of i = ', (i * i) printNl.
]
上面代码中的

'continue' 显然不起作用。我知道exit 可以用来跳出循环。但是如何continue?感谢您的帮助。

【问题讨论】:

    标签: loops smalltalk continue


    【解决方案1】:

    在您的情况下,您可以简单地使用ifFalse::

    1 to: 10 do: [ :i |
        i < 5 ifTrue: [ 
            "Any code you need"
        ] ifFalse: [ 'Square of i = ', (i * i) printNl ].
    ]
    

    以下代码可能仅适用于 Pharo。 (它在 GNU Smalltalk 中不起作用,在 Smalltalk/X 中,如果您使用正确的模数,它可以起作用。% 返回复数):

        1 to: 10 do: [ :i |
            [ :continue |
                i % 5 = 0 ifTrue: [ 
                    Transcript show: i; cr.
                    continue value ].
                Transcript 
                    show: i;
                    show: ', '.     
            ] valueWithExit.
        ]
    

    valueWithExit 在 Pharo 中的实现:

    valueWithExit 
          self value: [ ^nil ]
    

    含义:

    接收者必须是一个参数的块。当它被评估并传递一个块时,当发送value 消息时将退出接收块(在 Pharo 中返回 nil)。

    【讨论】:

    • 如果没有 ifFalse,你可以使用 ifTrue 吗?
    • @rnso 当然,你甚至可以只使用#ifFalse:。 (请注意,如果您拥有它下面的代码(在您的示例中),那么您在问题中所写的代码将始终被执行)
    • continue 代码位于:rosettacode.org/wiki/Loops/Continue#Smalltalk,但我无法理解。我该如何应用该方法?
    • 如果您使用的是 GNU Smalltalk,则不能像在 Pharo 中那样简单(Smalltalk/X 也实现了它,但 % 的含义与模数不同)。它没有实现#valueWithExit(您将收到此错误:error: did not understand #valueWithExit)。你必须自己实现它。那里显示的代码表明这是可以实现的,但实际使用是有限的(可以通过使用易于阅读、重用的ifTrue:ifFalse: 轻松实现)。你有什么理由坚持使用coninue
    • 我不坚持使用continue。我在 rosettacode 中看到了代码,并认为它在所有版本中都可用。请也看看这个问题:stackoverflow.com/questions/56086816/…
    猜你喜欢
    • 2020-12-26
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 2015-05-27
    • 2022-08-09
    • 2011-08-19
    相关资源
    最近更新 更多