Smalltalk - Vergleiche zwei Zeichenketten auf Gleichheit

8

Ich versuche, zwei Strings in Smalltalk zu vergleichen, aber ich tue etwas falsch.

Ich erhalte immer diesen Fehler:

Nicht behandelte Ausnahme: Nicht boolescher Empfänger. Geht zur Wahrheit.

%Vor%

Irgendeine Idee, was ich falsch mache?

    
user69514 29.10.2009, 02:28
quelle

6 Antworten

16

Versuchen Sie

%Vor%

Ich glaube nicht, dass Sie in der ersten Zeile eckige Klammern brauchen

Große Erklärung gefunden. Das ganze Ding ist hier

In Smalltalk sind boolesche Werte (dh Wahr oder Falsch) Objekte: Sie sind insbesondere Instanzen der Booleschen Basisklasse der abstrakten Basisklasse bzw. ihrer beiden Unterklassen True und False. Also hat jeder Boolesche Typ True oder False und keine tatsächlichen Mitgliedsdaten. Bool hat zwei virtuelle Funktionen, ifTrue: und ifFalse:, die als Argument einen Codeblock annehmen. Sowohl True als auch False überschreiben diese Funktionen; Die True-Version von ifTrue: ruft den Code auf, den sie übergeben hat, und die Version von False tut nichts (und umgekehrt für ifFalse :). Hier ist ein Beispiel:

%Vor%

Diese Dinge in eckigen Klammern sind übrigens im Wesentlichen anonyme Funktionen. Außer sie sind Objekte, weil alles ein Objekt in Smalltalk ist. Nun, was dort passiert ist, dass wir ein "& lt;" Methode, mit Argument b; Dies gibt einen booleschen Wert zurück. Wir nennen die Methoden ifTrue: und ifFalse: und übergeben als Argumente den Code, der in beiden Fällen ausgeführt werden soll. Der Effekt ist derselbe wie der des Ruby-Codes

%Vor%     
Bostone 29.10.2009, 02:35
quelle
4

Wie andere schon gesagt haben, funktioniert es so, wie Sie es wollen, wenn Sie den ersten Satz eckiger Klammern loswerden.

Aber um das Problem zu erklären, in das Sie geraten sind:

%Vor%

übergibt die Nachricht ifTrue: an einen Block, und Blöcke verstehen diese Methode nicht, nur boolsche Objekte.

Wenn Sie zuerst den Block auswerten, wird er zu einem wahren Objekt ausgewertet, das dann weiß, wie es reagieren soll:

%Vor%

Oder was Sie wirklich tun sollten, wie andere darauf hingewiesen haben:

%Vor%

beide werten stringOne = stringTwo auf true vor dem Senden von ifTrue:[...] aus.

    
Greg Leaver 29.10.2009 03:03
quelle
1

[stringOne = stringTwo] ist ein Block, kein Boolean. Wenn der Block aufgerufen wird, führt dies möglicherweise zu einem booleschen Wert. Aber Sie rufen den Block hier nicht auf. Stattdessen verursachen Sie lediglich, dass der Block der Empfänger von ifTrue ist.

Versuchen Sie stattdessen:

%Vor%     
yfeldblum 29.10.2009 02:37
quelle
0

Sollten Sie den Vergleich blockieren? Ich hätte das gedacht:

%Vor%

wäre genug.

    
paxdiablo 29.10.2009 02:36
quelle
0
  

aber ich schein etwas falsch zu machen

Da Sie VisualWorks verwenden, sollte Ihre Installation einen doc-Ordner enthalten.

Sehen Sie sich den AppDevGuide.pdf an - er enthält viele Informationen über die Programmierung mit VisualWorks und darüber hinaus viele einführende Informationen zur Smalltalk-Programmierung.

Schauen Sie am Anfang durch die Inhaltstabelle, bis Kapitel 7 "Kontrollstrukturen" auf "Verzweigungen" oder "Bedingte Tests" klicken und Sie werden zum entsprechenden Abschnitt in der PDF-Datei weitergeleitet erzählt Ihnen alles über Smalltalk if-then-else und gibt Beispiele, die Ihnen geholfen hätten zu sehen, was Sie falsch gemacht haben.

    
igouy 30.10.2009 18:02
quelle
0

Ich möchte folgende 50 Cent hinzufügen:

da Blöcke tatsächlich Lambdas sind, die herumgereicht werden können, wäre ein anderes gutes Beispiel die folgende Methode:

%Vor%

Also kann das Argument zu ifTrue: / ifFalse: tatsächlich von jemand anderem kommen. Diese Art von Passt-in-Bedingungen ist oft nützlich in "..ifAbsent:" oder ".. onError:" Art von Methoden.

(ursprünglich als Kommentar gedacht, aber ich konnte das Codebeispiel nicht unformatiert bekommen)

    
blabla999 11.05.2011 07:55
quelle