Tout en question a déjà été sayd, mais juste pour votre amusement:
Comme nous l'avons dit,
rcvr ifTrue:[...] ifFalse:[...]
est le seul et seul message # 'ifTrue: ifFalse:' avec 2 args envoyé à rcvr. La valeur de cette expression est celle de ce message envoyé. En revanche:
rcvr ifTrue:[...]; ifFalse:[...]
est une cascade de messages séquentiels 2 (# de 'ifTrue: 'et #' ifFalse:'), chacune avec une arg envoyé à RCVR. La valeur de l'expression est celle renvoyée par le dernier envoi.
Maintenant, la chose drôle est que booléens ne comprennent ifTrue:/ifFalse: (chacun avec 1 arg), si votre code fonctionne pour l'effet secondaire (l'évaluation de ces blocs), mais pas pour sa valeur. Cela signifie que:
a > b ifTrue:[Transcript showCR:'gt'] ; ifFalse:[Transcript showCR:'le']
génère la même sortie que:
a > b ifTrue:[Transcript showCR:'gt'] ifFalse:[Transcript showCR:'le']
mais:
msg := a > b ifTrue:['gt'] ; ifFalse:['le']
va générer des valeurs différentes dans msg que:
msg := a > b ifTrue:['gt'] ifFalse:['le']
en fonction des valeurs de a et b. Essayez (a b) = (1 2) vs (a b) = (2 1) ...
Le problème de nombreux débutants Smalltalk est qu'ils pensent à ifXXX: comme syntaxe, où il s'agit en fait d'un envoi de message qui génère de la valeur. En outre, le semi n'est pas un séparateur d'instructions comme dans beaucoup de langues précédemment apprises, mais une construction d'envoi de message de séquencement.
Un piège pour les débutants, parce que le code semble fonctionner pour certaines combinaisons de valeurs particulières, alors qu'il génère des résultats amusants pour les autres. Espérons que vos tests unitaires couvrent ces ;-)
edit: pour voir où la mauvaise valeur vient, jetez un oeil à ce qui est retourné par la Boolean >> ifFalse: méthode pour un vrai récepteur ...
Juste pour l'exhaustivité, le; est pour une _cascade_ - une séquence de messages envoyés au même objet. foo bar; baz. est identique au sens de foo bar. foo baz. –
votre compréhension est fausse; ce n'est pas "reçoit ... ET ALORS ...", mais "reçoit un message". Voir ma réponse ci-dessous. – blabla999