Pregunta

Una clase que estoy tomando en la actualidad requiere de nosotros para hacer de nuestra codificación en smalltalk (es una clase de Diseño).En uno de nuestros proyectos, estoy buscando para hacer algunas cosas, y estoy teniendo un tiempo difícil encontrar cómo hacerlo.Parece que lo que la mayoría de la gente hace es modificar su propia versión de smalltalk para hacer lo que necesitan hacer.No estoy en libertad para hacerlo, ya que esto podría causar un error en mi profe del equipo cuando no tiene el mismo integrado en los métodos que yo hago.

Esto es lo que yo estoy buscando para hacer:

Números Aleatorios.Necesito crear un número aleatorio entre 1 y 1000.Ahora mismo estoy fingiendo haciendo

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

Esto me da un número entre 0 y 1000.Es allí una manera de hacer esto en un comando?similar a

Random between: 0 and: 1000

Y/O declaraciones.Este uno de los errores de the living daylights fuera de mí.He probado varias configuraciones diferentes de

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

Así que estoy fingiendo con anidada ifTrue declaraciones:

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

¿Cuál es la forma correcta de hacer y/o y al Azar en smalltalk?

¿Fue útil?

Solución

El problema es que

 (expr) and: (expr) ifTrue: aBlock

se analiza como el método and:ifTrue: Si observa la clase booleana (y Verdadero o Falso en particular), observa que ifTrue: es solo un método regular, y que no existe ningún método y: ifTrue: existe, sin embargo , simple y: hace. Entonces, para dejar en claro que estos son dos mensajes, escriba

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

Para combinaciones booleanas más largas, observe que también hay métodos y: y: y y: y: y: implementados.

Otros consejos

(1 to: 1000) atRandom

Si está utilizando VisualWorks, y: toma un bloque como argumento, entonces escribiría:

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

También hay &, que no toma un bloque como argumento,

aBoolean & anotherBoolean ifTrue:[doSomething].

La diferencia es y: solo evalúa lo que hay en el bloque si el primer bool es verdadero (similar a Java), mientras que and: siempre evalúa ambos.

Por lo tanto, Random >> between: and: es útil si la segunda condición es computacionalmente costosa, o si incluye alteraciones de estado que solo deberían ocurrir cuando la primera condición es verdadera. (aunque generalmente es un mal diseño).

En cuanto al Aleatorio, siempre que entregue su método personalizado, <=> así como el resto de su código, funciona bien en la computadora de su profesor. Cómo hacerlo específicamente, depende del formato en el que se supone que debe entregar la tarea.

En cuanto al problema aleatorio: depende de la versión ST que use. En Squeak 3.9, hay Random>>#nextInt:, que se documenta como & Quot; Responde un entero aleatorio en el intervalo [1, anInteger]. & Quot ;. Su implementación se lee

(self next * anInteger) truncated + 1

Entonces tengo dos comentarios aquí:

  1. Realmente deberías aprender a usar el navegador de clases. Esto puede responder las preguntas (frecuentes) & Quot; ¿qué mensajes puedo enviar a los objetos de la clase X & Quot;
  2. Es común, en ST, agregar nuevos métodos a las clases existentes. Entonces, si desea que Random tenga entre: y :, simplemente agréguelo, p. como

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

En pocas palabras, sin conocer el dialecto Smalltalk, solo puedo dar una respuesta general. La forma en que usted planteó la pregunta aleatoria, sí, esa es la única forma de hacerlo si su profesor necesita una respuesta genérica.

En cuanto a la pregunta y / o declaraciones,

  

Y / o declaraciones. Este me molesta la luz del día. He probado varias configuraciones diferentes de

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

Lo que quieres probar es:

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

tenga en cuenta los corchetes, el método y: toma un bloque como argumento.

Para crear varios enteros aleatorios entre 1 y 1000
Primero crear un número aleatorio de la serie.Hacer esto sólo una vez.

A continuación, cree un nuevo número aleatorio tomando el siguiente número de la serie.Repita según sea necesario.

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"

Operaciones lógicas

aBoolean responderá a and: y or:.Ambos toman bloque de argumentos.

Aquí es cómo trabajan.

and: alternativeBlock
Si el receptor es cierto, contestar el valor de alternativeBlock;de lo contrario, la respuesta falsa sin evaluar alternativeBlock.

or: alternativeBlock
Si el receptor es falso, de respuesta el valor de alternativeBlock;de lo contrario, la respuesta verdadera sin la evaluación de alternativeBlock.

por ejemplo,
( 3 > 2 ) or: [ 3 < 4 ] ifTrue: [ ]
aBoolean and: [ anotherBoolean ] ifFalse: [ ]

Sin embargo, Squeak y Pharo Smalltalks ambos aceptan un argumento entre paréntesis ( )
Dolphin Smalltalk no, y estrictamente requiere el estándar de sintaxis de Smalltalk de un bloque de argumento.

Otros métodos relacionados con:
& un Y que no requiere de un cuadrado bracketted (es decir,bloque) argumento
| un O que no requiere de un cuadrado bracketted (es decir,bloque) argumento
& y | trabajo en el Ámbar, el Cuis, Gnu, Pharo, Squeak, VisualAge y VisualWorks Smalltalks.

Squeak Smalltalk también proporciona:
and:and: }
and:and:and: } Estas toman múltiples bloque de argumentos
and:and:and:and }

or:or: }
or:or:or: } Estas toman múltiples bloque de argumentos
or:or:or:or: }

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top