The ���Kent Beck approved solutions��� here are two:
1) To use a dictionary (or ordered dictionary).
case := OrderedDictionary newFromPairs: {
[ cond ]. [ do ].
[ cond ]. [ do ].
[ true ]. [ otherwise do ] }
case keysAndValuesDo: [ :cond :do |
(cond value: expression) ifTrue: [
���you need to break here"
^ do value ].
2) To use a ���case method���
caseMethod: expression
expression = cond1 ifTrue: [ ^ do1 ].
expression = cond2 ifTrue: [ ^ do2 ].
^ otherwise
Personally, I prefer the second one because is more concise, performant and easy to understand.
Esteban
It would be an overkill to do it for this particular case, but Smalltalk makes it possible to implement a case-like construction:
[ expression ]
when: [ :value | condition1 ] do: [-0do :value | ... ];
when: [ :value | condition2 ] do: [ :value | ... ];
otherwiseDo: [ :value | ... ];
evaluate
I am sure, something like this has been implemented already somewhere (maybe in Squeak?). Still not sure it is practical as compared to simple if-s, and for sure not widely used :)
...On the other hand, sometimes the case-like construction can be considered a more intension-revealing style.
Hello,
Im trying to solve a challenge from exercism where I have to
calculate the points somehow gets on a very simple darts board.
I solved it like this :
scoreX: anInteger y: anInteger2
| distance |
distance := (anInteger squared + anInteger2 squared) sqrt.
distance > 10
ifTrue: [ ^ 0 ].
distance > 5
ifTrue: [ ^ 1 ].
distance > 1
ifTrue: [ ^ 5 ].
^ 10
but now I use three if then and I think it's ugly code.
Is there a way I can make it more the smalltalk way ?
Regards,
Roelof