Loops GNU Smalltalk-从whileTrue循环中断而不返回
在GNU Smalltalk中,什么是一种简单而简洁的方法来打破不需要返回的Loops GNU Smalltalk-从whileTrue循环中断而不返回,loops,while-loop,break,smalltalk,gnu-smalltalk,Loops,While Loop,Break,Smalltalk,Gnu Smalltalk,在GNU Smalltalk中,什么是一种简单而简洁的方法来打破不需要返回的whileTrue循环 这是我的密码。如果char\u stack为空,我想在末尾第31行中断循环 任何帮助都将不胜感激 一般来说,Smalltalk没有从循环中断的方法,除了从封闭方法返回 尝试将您的循环提取到另一个方法中,从中可以返回以从循环中中断 在某种程度上,Smalltalk语言甚至没有循环。。。但有些方法会多次评估块。因此,它没有终止“循环”的特殊方法。回归才是出路 如果尚未这样做,请熟悉收集的不同迭代方法
whileTrue
循环
这是我的密码。如果char\u stack
为空,我想在末尾第31行中断循环
任何帮助都将不胜感激 一般来说,Smalltalk没有从循环中断的方法,除了从封闭方法返回 尝试将您的循环提取到另一个方法中,从中可以返回以从循环中中断 在某种程度上,Smalltalk语言甚至没有循环。。。但有些方法会多次评估块。因此,它没有终止“循环”的特殊方法。回归才是出路
如果尚未这样做,请熟悉收集的不同迭代方法:
do:
,选择:
,收集:
,检测:ifNone:
。。。后者是在集合上运行“不完整”循环的另一种方式,但它并不能解决您可能希望“中断”的所有情况。Byte杂志(1982)的一篇文章,题为《在Smalltalk-80系统中构建控制结构》,作者彼得·德伊奇,显示了在循环内部可能发生的不常见事件的循环中断时实现的容易程度
为了实现这一点,我们只需要一个新类和对BlockClosure
的扩展,总共有9行代码(!)
类:BlockWithExit
,对象
的子类,具有两个ivarexit
和block
以及以下方法
on: aBlock
block := aBlock
value
exit := [^nil].
^block value
exit
exit value
扩展
BlockClosure>>withExit
^BlockWithExit new on: self
就这样
示例
查找集合的最大值,直到其耗尽或找到nil
(罕见事件)
为什么这样做?因为具有非本地返回的块从定义该块的方法中退出
在这种情况下,此方法是BlockWithExit>>value
,因此当从循环退出计算[^nil]
时,流退出value
,并在循环值
之后到达其发送方
Deutsch发现的一个突出推论是异常的整个机制可以使用与在ivar中定义退出块相同的技巧来构建,如:exit:=[^nil]
,感谢您的帮助和彻底的回答。我会记住那件事的。
maxBeforeNil: aCollection
| max supplier loop |
max := 0.
supplier := aCollection readStream.
loop := [
[supplier atEnd]
whileFalse: [
value := supplier next.
value isNil ifTrue: [loop exit].
max := max max: value]] withExit.
loop value.
^max