Category:Smalltalk: Difference between revisions

Line 500:
it should be noted that a "ˆ" (return) inside a block will return from the enclosing method, NOT only from the block. And that this is an essential semantic property of the return (technically, it may be a long return from a deeply nested call hierarchy, possibly involving unwind actions).
 
This makes it possible to pass a block to eg. collections to enumerate elements up-to and until some condition is met. For example, if we need a helper method, which returnssearches the first element fromin a dataset which meetsto some condition and evaluate an action on it, we can write:
<lang smalltalk>findSomeElementWhichMeetsCondition:conditionBlock thenDo:actionBlock ifNone:failBlock
dataSet do:[:eachElement |
Line 509:
^ failBlock value</lang>
Here, a block is passed to the dataSet's "do:" method, which will return (if invoked inside the "do:") from the containing findSomeElement method.
The above can be used as:
If a block-return (as eg. in JavaScript) would one return from itself, this wasn't possible, and ugly workarounds (like exceptions or long-jumps) were needed.
<lang smalltalk>myDataSet
findSomeElementWhichMeetsCondition:[:record | record name = 'John']
thenDo:[:record | record print ]
ifNone:[ 'nothing found' print ]</lang>
If a block-return (as eg. in JavaScript) would oneonly return from itselfthe inner scope, this wasn't possible, and ugly workarounds (like exceptions or long-jumps) were needed.
 
There are rare situations, where an explicit block return is needed (for example, to break out of a loop in the middle, without returning from the method). For this, block provides a special "valueWithExit" method, so you can write:
Anonymous user