Domanda

Una classe che sto prendendo attualmente richiede che facciamo tutta la nostra codifica in smalltalk (è una classe di Design). In uno dei nostri progetti, sto cercando di fare alcune cose e sto facendo fatica a trovare il modo di farle. Sembra che ciò che molte persone fanno sia modificare la propria versione di SmallTalk per fare ciò di cui hanno bisogno. Non sono libero di farlo, poiché ciò causerebbe un errore sul computer del mio prof quando non ha gli stessi metodi integrati che uso io.

Ecco cosa sto cercando di fare:

Numeri casuali. Devo creare un numero casuale tra 1 e 1000. In questo momento sto fingendo facendo

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

Questo mi dà un numero compreso tra 0 e 1000. C'è un modo per farlo in un comando? simile a

Random between: 0 and: 1000

E / o dichiarazioni. Questo mi infastidisce la luce del giorno. Ho provato diverse configurazioni di

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

Quindi lo sto falsificando con istruzioni ifTrue nidificate:

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

Qual è il modo corretto di fare e / o e casuale in smalltalk?

È stato utile?

Soluzione

Il problema è che

 (expr) and: (expr) ifTrue: aBlock

viene analizzato come metodo and:ifTrue: Se si esamina la classe booleana (e True o False in particolare), si nota che ifTrue: è solo un metodo regolare e che non esiste alcun metodo e: ifTrue: esiste - tuttavia , semplice e: lo fa. Quindi, per chiarire che si tratta di due messaggi, scrivi

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

Per combinazioni booleane più lunghe, nota che ci sono anche metodi e: e: e e: e: e: implementati.

Altri suggerimenti

(1 to: 1000) atRandom

Se stai usando VisualWorks e: accetta un blocco come argomento, quindi dovresti scrivere:

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

C'è anche &, che non accetta un blocco come argomento,

aBoolean & anotherBoolean ifTrue:[doSomething].

La differenza è e: valuta ciò che è nel blocco solo se il primo bool è vero (simile a Java), mentre and: valuta sempre entrambi.

Pertanto Random >> between: and: è utile se la seconda condizione è computazionalmente costosa o se include alterazioni dello stato che dovrebbero verificarsi solo quando la prima condizione è vera. (di solito è un cattivo design).

Per quanto riguarda il Casuale, fintanto che fornisci il tuo metodo personalizzato, <=> così come il resto del tuo codice, funziona perfettamente sul tuo computer professori. Come farlo specificamente, dipende dal formato in cui dovresti consegnare l'incarico.

Per quanto riguarda il problema casuale: dipende dalla versione ST che usi. In Squeak 3.9, c'è Random>>#nextInt:, che è documentato come & Quot; Rispondi a un numero intero casuale nell'intervallo [1, anInteger]. & Quot ;. La sua implementazione recita

(self next * anInteger) truncated + 1

Quindi ho due commenti qui:

  1. Dovresti davvero imparare a usare il browser delle classi. Questo può rispondere alle (frequenti) domande & Quot; quali messaggi posso inviare a oggetti di classe X & Quot;
  2. È comune, in ST, aggiungere nuovi metodi alle classi esistenti. Quindi, se vuoi che Random abbia tra: e :, aggiungilo, ad es. come

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

Per dirla semplicemente, senza conoscere il dialetto Smalltalk, posso solo dare una risposta generale. Il modo in cui hai espresso la domanda casuale, sì, è l'unico modo per farlo se il tuo professore ha bisogno di una risposta generica.

Per quanto riguarda la domanda e / o le dichiarazioni,

  

E / o dichiarazioni. Questo mi infastidisce la luce del giorno. Ho provato diverse configurazioni di

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

Quello che vuoi provare è:

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

nota le parentesi, il metodo e: accetta un blocco come argomento.

Per creare diversi numeri interi casuali tra 1 e 1000
Innanzitutto crea una serie di numeri casuali. Fallo solo una volta.

Quindi crea un nuovo numero casuale prendendo il numero successivo dalla serie. Ripeti se necessario.

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"

Operazioni logiche

aBoolean risponderà a and: e or:. Entrambi accettano argomenti a blocchi .

Ecco come funzionano.

and: alternativeBlock
Se il ricevitore è vero, rispondi al valore di alternativeBlock; altrimenti rispondi falso senza valutare alternativeBlock.

or: alternativeBlock
Se il ricevitore è falso, rispondi al valore di alternativeBlock; altrimenti rispondi vero senza valutare alternativeBlock.

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

Tuttavia, Squeak e Pharo Smalltalks accettano entrambi un argomento tra parentesi ( )
Dolphin Smalltalk non lo farà e richiede rigorosamente la sintassi Smalltalk standard di un argomento block.

Altri metodi correlati:
& un AND che non richiede un argomento con parentesi quadre (ovvero blocco)
| un OR che non richiede un argomento con parentesi quadre (ovvero blocco)
and:and: } e and:and:and: } funzionano in Amber, Cuis, Gnu, Pharo, Squeak, VisualAge e VisualWorks Smalltalks.

Squeak Smalltalk fornisce anche:
and:and:and:and }
or:or: } Questi accettano più argomenti di blocco
or:or:or: }

or:or:or:or: }
<=> Questi accettano più argomenti di blocco
<=>

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top