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%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.
[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%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.
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)
Tags und Links string smalltalk squeak visualworks