Frage

Eine Klasse ich zur Zeit nehmen erfordert, dass wir alle unsere Codierung in smalltalk zu tun (es ist ein Design-Klasse). Auf einem unserer Projekte, ich suche ein paar Dinge zu tun, und habe eine harte Zeit zu finden, wie sie zu tun. Es scheint, dass die meisten Menschen, was zu tun ist, ihre eigene Version von smalltalk ändern zu tun, was sie brauchen, es zu tun. Ich bin nicht frei, dies zu tun, da dies würde einen Fehler auf meinem prof des Computers verursachen, wenn er nicht die gleichen Einbau in hat Methoden, die ich tun.

Hier ist, was ich bin auf der Suche zu tun:

Zufallszahlen. Ich brauche eine Zufallszahl zwischen 1 und 1000. Im Moment ist es mir Fälschen erstellen, indem Sie

rand := Random new.
rand := (rand nextValue) * 1000.
rand := rand asInteger.

Das gibt mir eine Zahl zwischen 0 und 1000. Gibt es eine Möglichkeit, dies in einem Befehl zu tun? ähnlich wie

Random between: 0 and: 1000

Und / Oder-Anweisungen. Dieser Fehler die lebenden daylights aus mir heraus. Ich habe versucht, mehrere verschiedene Konfigurationen von

(statement) and: (statement) ifTrue...
(statement) and (statement) ifTrue...

Also habe ich es mit verschachtelten ifTrue Aussagen bin Fälschen:

(statement) ifTrue:[
    (statement) ifTrue:[...

Was ist der richtige Weg und / oder und Zufall in smalltalk zu tun?

War es hilfreich?

Lösung

Das Problem ist, dass

 (expr) and: (expr) ifTrue: aBlock

wird als Methode and:ifTrue: analysiert Wenn man sich die Boolesche Klasse aussehen (und entweder wahr oder falsch), insbesondere Sie feststellen, dass ifTrue: ist nur eine ganz normale Methode, und dass kein Verfahren und: ifTrue: existiert - aber schlicht und tut. So deutlich zu machen, dass diese zwei Nachrichten, schreibt

((expr) and: (expr)) ifTrue: aBlock

Für längere boolean Kombinationen, feststellen, dass es auch Methoden und: und: und und: und: und:. Implementiert

Andere Tipps

(1 to: 1000) atRandom

Wenn Sie Visual verwenden, und: nimmt einen Block als Argument, so würden Sie schreiben:

(aBoolean and: [anotherBoolean]) ifTrue: [doSomething].

Es gibt auch &, die nicht einen Block als Argument nimmt,

aBoolean & anotherBoolean ifTrue:[doSomething].

Der Unterschied ist, und: wertet nur das, was in dem Block ist, wenn die erste bool true (ähnlich wie Java), während & beide immer auswertet

.

So kommt and: in praktisch, wenn die zweite Bedingung rechnerisch teuer ist, oder wenn es Staat Änderungen enthält, die nur passieren, wenn die erste Bedingung erfüllt ist. (Das ist in der Regel ein schlechtes Design obwohl).

Wie für den Zufall, solange Sie Ihre eigene Methode liefern, Random >> between: and: sowie der Rest des Codes, läuft es auf Ihrem Computer Professoren in Ordnung. Wie das zu tun, speziell auf das Format ab, in dem Sie sollen die Zuordnung liefern.

Wie für den Zufall Problem: es hängt davon ab, was ST-Version verwenden. In Quietschen 3,9, ist es Random>>#nextInt:, die als „Antwort eine Zufallszahl in dem Intervall [1, anInteger].“ Dokumentiert ist. Seine Umsetzung liest

(self next * anInteger) truncated + 1

So habe ich zwei Bemerkungen hier:

  1. Sie sollten wirklich lernen die Klasse Browser zu verwenden. Dies kann die (häufig) Fragen beantworten
  2. „welche Nachrichten kann ich auf Objekte der Klasse X senden“
  3. Es ist üblich, in ST, neue Methoden zu bestehenden Klassen hinzuzufügen. Wenn Sie also Zufall haben wollen zwischen: und :, nur hinzuzufügen, z.B. wie

    between: low and: high      
       ^(self next * (high-low+1)) truncated + low
    

Um es einfach auszudrücken, ohne den Smalltalk Dialekt zu wissen, kann ich nur eine allgemeine Antwort geben. Die Art und Weise Sie die zufällige Frage erwähnt, ja das ist der einzige Weg, es zu tun, wenn Ihr Professor eine allgemeine Antwort muss.

Wie für die und / oder Aussagen Frage,

  

Und / Oder-Anweisungen. Dieser Fehler die lebenden daylights aus mir heraus. Ich habe versucht, mehrere verschiedene Konfigurationen von

(statement) and: (statement) ifTrue...
(statement) and (statement) ifTrue...

Was Sie wollen, ist zu versuchen:

(statement) and: [statement] ifTrue: [ ... ]

die Klammern beachten Sie, dass das und:. Methode nimmt einen Block als Argument

So erstellen Sie mehrere Zufallszahl zwischen 1 und 1000
Erste, der eine Zufallszahlenserie erstellen. Tun Sie dies nur einmal.

Dann eine neue Zufallszahl erzeugen, indem die nächste Nummer aus der Serie nehmen. Bei Bedarf wiederholen.

aRandomSeries := Random new .
    "Seed a new series of random numbers"  

aRandomInt := aRandomSeries newInt: 1000 . 
    "generate a random integer between 0 and 1000"

anotherRandomInt := aRandomSeries newInt: 1000 .
    "generate another random integer between 0 and 1000"

Logische Operationen

aBoolean reagiert auf and: und or:. Beide nehmen Block Argumente .

Hier ist, wie sie funktionieren.

and: alternativeBlock
Wenn der Empfänger wahr ist, beantworten Sie den Wert von alternativeBlock; andernfalls falsch beantworten, ohne alternativeBlock zu bewerten.

or: alternativeBlock
Wenn der Empfänger falsch ist, beantworten Sie den Wert von alternativeBlock; sonst wahr beantworten, ohne alternativeBlock zu bewerten.

z.
( 3 > 2 ) or: [ 3 < 4 ] ifTrue: [ ]
aBoolean and: [ anotherBoolean ] ifFalse: [ ]

Allerdings Squeak und Pharo Smalltalks wird sowohl ein Argument in Klammern akzeptieren ( )
Dolphin Smalltalk nicht, und erfordert strenge Kontrolle der Standard-Smalltalk Syntax eines Block-Argument.

Weitere ähnliche Methoden:
& ein und , die keinen Platz bracketted erfordert (d-Block) Argument
| ein ODER , das keinen Platz bracketted erfordert (d-Block) Argument
& und | Arbeit in Bernstein, Cuis, Gnu, Pharo, Squeak, VisualAge und Visual Smalltalks.

Squeak Smalltalk bietet auch:
and:and: }
and:and:and: } Diese mehrere Block Argumente
and:and:and:and }

or:or: }
or:or:or: } Diese mehrere Block Argumente
or:or:or:or: }

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top