2010-06-27 6 views
7
a > b 
ifTrue:[ 'greater' ] 
ifFalse:[ 'less or equal' ] 

mia comprensione è che booleano a> b riceve il messaggio ifTrue: [ 'maggiore'], e quindi ifFalse: [ 'minore o uguale'] rispetto alla generalizzazione:Perché ifTrue e ifFalse non sono separati da; in Smalltalk?

objectInstance selector; selector2 

Ma c'è un punto e virgola è necessario per specificare che il destinatario di selector2 non è (objectInstance selector) ma objectInstance. Non è lo stesso con l'esecuzione condizionale di cui sopra?

+0

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. –

+0

la tua comprensione è sbagliata; non "riceve ... E POI ...", ma "riceve un messaggio". Vedi la mia risposta qui sotto. – blabla999

risposta

19

Il selettore del metodo è Boolean>>ifTrue:ifFalse:, che significa che è una metodo con due parametri, non due metodi con uno parametro.

Ergo, per richiamare il metodo, si invia il messaggio ifTrue:ifFalse: con due argomenti di blocco.

Si noti che per motivi di praticità, esistono anche i metodi Boolean>>ifFalse:ifTrue:, Boolean>>ifTrue: e Boolean>>ifFalse:.

7

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 ...

+0

+1 per la notifica di diversi valori di ritorno –

Problemi correlati