Tutto in questione è già stato sayd, ma solo per il vostro divertimento:
Come già detto,
rcvr ifTrue:[...] ifFalse:[...]
è l'unico e unico messaggio # 'ifTrue: ifFalse:' con 2 args inviato a rcvr. Il valore di quell'espressione è quello da quel messaggio inviato. Al contrario:
rcvr ifTrue:[...]; ifFalse:[...]
è una cascata di 2 messaggi sequenziali (# 'ifTrue: 'e #' ifFalse:'), ciascuna con 1 arg inviato a RCVR. Il valore dell'espressione è quello restituito dall'ultima mandata.
Ora la cosa divertente è che booleani capiscono ifTrue:/ifFalse: (ognuna con 1 arg), in modo che il codice funziona per l'effetto collaterale (valutazione di quei blocchi), ma non per il suo valore. Questo significa che:
a > b ifTrue:[Transcript showCR:'gt'] ; ifFalse:[Transcript showCR:'le']
genera lo stesso risultato:
a > b ifTrue:[Transcript showCR:'gt'] ifFalse:[Transcript showCR:'le']
ma:
msg := a > b ifTrue:['gt'] ; ifFalse:['le']
genererà valori diversi in msg di:
msg := a > b ifTrue:['gt'] ifFalse:['le']
in base ai valori di a e b. Prova (a b) = (1 2) vs. (a b) = (2 1) ...
Il problema di molti principianti Smalltalk è che pensano allo ifXXX: come sintassi, dove in realtà è un messaggio di invio che genera valore. Inoltre, il semi non è un separatore di istruzioni come in molte lingue precedentemente apprese, ma un costrutto di invio di messaggi di sequenziamento.
Una trappola negativa per i principianti, perché il codice sembra funzionare per alcune particolari combinazioni di valori, mentre genera risultati divertenti per gli altri. Speriamo il test di unità coprono questi ;-)
edit: per vedere dove il valore male proviene, dare un'occhiata a ciò che viene restituito dalla booleano >> ifFalse: metodo per un vero e proprio ricevitore ...
Solo per completezza, il; è per un _cascade_ - una sequenza di messaggi inviati allo stesso oggetto. foo bar; baz. è identico nel significato a foo bar. foo baz. –
la tua comprensione è sbagliata; non "riceve ... E POI ...", ma "riceve un messaggio". Vedi la mia risposta qui sotto. – blabla999