【发布时间】: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?感谢您的帮助。
【问题讨论】:
如果 i 小于 5,我想“继续”以下代码:
1 to: 10 do: [ :i |
i < 5 ifTrue: [ continue ].
'Square of i = ', (i * i) printNl.
]
上面代码中的 'continue' 显然不起作用。我知道exit 可以用来跳出循环。但是如何continue?感谢您的帮助。
【问题讨论】:
在您的情况下,您可以简单地使用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:。 (请注意,如果您拥有它下面的代码(在您的示例中),那么您在问题中所写的代码将始终被执行)
continue 代码位于:rosettacode.org/wiki/Loops/Continue#Smalltalk,但我无法理解。我该如何应用该方法?
% 的含义与模数不同)。它没有实现#valueWithExit(您将收到此错误:error: did not understand #valueWithExit)。你必须自己实现它。那里显示的代码表明这是可以实现的,但实际使用是有限的(可以通过使用易于阅读、重用的ifTrue:ifFalse: 轻松实现)。你有什么理由坚持使用coninue?
continue。我在 rosettacode 中看到了代码,并认为它在所有版本中都可用。请也看看这个问题:stackoverflow.com/questions/56086816/…