Warum ifTrue und ifFalse nicht getrennt werden von; in Smalltalk?

7
%Vor%

Mein Verständnis ist, dass Boolean a & gt; b erhält die Nachricht ifTrue: ['greater'] und dann ifFalse: ['less oder equal'], die der Generalisierung entspricht:

%Vor%

Aber dort ist ein Semikolon erforderlich, um anzugeben, dass der Empfänger von selector2 nicht (objectInstance-Selektor) ist, sondern objectInstance. Ist das nicht dasselbe mit der obigen bedingten Ausführung?

    
simpatico 27.06.2010, 13:20
quelle

2 Antworten

19

Der Selektor der Methode ist Boolean>>ifTrue:ifFalse: , was bedeutet, dass es eine Methode mit zwei Parametern ist, nicht zwei Methoden mit ein Parameter.

Ergo, um die Methode aufzurufen, senden Sie ihr die Nachricht ifTrue:ifFalse: mit zwei Blockargumenten.

Beachten Sie, dass es aus Bequemlichkeitsgründen auch die Methoden Boolean>>ifFalse:ifTrue: , Boolean>>ifTrue: und Boolean>>ifFalse: gibt.

    
Jörg W Mittag 27.06.2010, 13:29
quelle
7

Alles Relevante wurde schon gesagt, aber nur zu Ihrer Belustigung:

Wie bereits gesagt,

%Vor%

ist die einzige und einzige Nachricht # ' ifTrue: ifFalse: ' mit 2 Argumenten, die an rcvr gesendet werden. Der Wert dieses Ausdrucks ist der Wert aus dieser Nachrichtensendung. Im Gegensatz dazu:

%Vor%

ist eine Kaskade von 2 aufeinanderfolgenden Nachrichten (# ' ifTrue: ' und # ' ifFalse: '), wobei jeweils 1 arg an rcvr . Der Wert des Ausdrucks ist derjenige, der vom letzten Senden zurückgegeben wurde.

Nun ist das Komische daran, dass Boolesches Verhalten ifTrue: / ifFalse: (jeweils mit 1 Argument) versteht. Ihr Code funktioniert also für den Nebeneffekt (Bewertung dieser Blöcke), aber nicht für seinen Wert. Das bedeutet:

%Vor%

erzeugt die gleiche Ausgabe wie:

%Vor%

aber:

%Vor%

erzeugt in msg andere Werte als:

%Vor%

abhängig von den Werten von a und b . Versuchen Sie (a b) = (1 2) gegen (a b) = (2 1) ...

Das Problem vieler Smalltalk-Anfänger ist, dass sie an ifXXX: als Syntax denken, bei der es sich tatsächlich um eine Nachrichtensendung handelt, die einen Wert generiert. Außerdem ist das Semi kein Anweisungstrennzeichen wie in vielen zuvor erlernten Sprachen, sondern eine Sequenznachricht, die ein Konstrukt sendet.

Eine schlechte Falle für Anfänger, denn der Code scheint für bestimmte Wertkombinationen zu funktionieren, während er für andere lustige Ergebnisse liefert. Lass uns hoffen, dass deine Unit-Tests diese abdecken ;-)

edit: Um zu sehen, woher der schlechte Wert kommt, schauen Sie sich an, was vom booleschen & gt; & gt; ifFalse: Methode für einen echten Empfänger ...

    
blabla999 28.11.2012 11:31
quelle

Tags und Links