Pergunta

A classe estou tendo atualmente requer que façamos todo o nosso codificação em Smalltalk (é uma classe de design). Em um de nossos projetos, eu estou olhando para fazer algumas coisas, e estou tendo um momento difícil encontrar a forma de fazê-las. Parece que o que a maioria das pessoas fazer é modificar a sua própria versão de Smalltalk para fazer o que eles precisam fazer. Eu não tenho a liberdade de fazer isso, pois isso causaria um erro no computador do meu prof quando ele não tem o mesmo built-in métodos que eu faço.

Aqui está o que eu estou procurando fazer:

números aleatórios. Eu preciso criar um número aleatório entre 1 e 1000. Agora eu estou fingindo, fazendo

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

Isso me dá um número entre 0 e 1000. Existe uma maneira de fazer isso em um comando? semelhante ao

Random between: 0 and: 1000

e / ou declarações. Este um insetos vivos daylights fora de mim. Eu tentei várias configurações diferentes de

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

Então, eu estou fingindo com as declarações ifTrue aninhados:

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

O que é a maneira correta de fazer e / ou e aleatória em Smalltalk?

Foi útil?

Solução

O problema é que

 (expr) and: (expr) ifTrue: aBlock

é analisado como o and:ifTrue: método Se você olhar para a classe booleana (e Verdadeiro ou Falso, em particular), você percebe que ifTrue: é apenas um método regular, e que nenhum método e: ifTrue: existe - porém, plain e faz. Então, para deixar claro que estas são duas mensagens, escreva

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

Para combinações mais boolean, aviso que existem também métodos e: e: ee: e: e:. Implementadas

Outras dicas

(1 to: 1000) atRandom

Se você estiver usando VisualWorks, e: leva um bloco como um argumento, então você escreveria:

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

Há também &, que não leva um bloco como argumento,

aBoolean & anotherBoolean ifTrue:[doSomething].

A diferença é e:. Avalia apenas o que está no bloco se o primeiro bool é verdade (semelhante ao java), enquanto & sempre avalia tanto

Assim and: vem a calhar se a segunda condição é computacionalmente caro, ou se ele inclui alterações de estado que só deve acontecer quando a primeira condição é verdadeira. (Que é geralmente um design ruim embora).

Quanto ao acaso, enquanto você entregar o seu método personalizado, Random >> between: and:, bem como o resto do seu código, ele funciona muito bem em seu computador professores. Como fazer isso especificamente, depende do formato em que você é suposto para entregar a tarefa.

Quanto à questão aleatória: isso depende do que ST versão que você usa. Em rangido 3,9, há Random>>#nextInt:, que está documentado como "Resposta um número aleatório no intervalo [1, anInteger].". Sua implementação lê

(self next * anInteger) truncated + 1

Então, eu tenho dois comentários aqui:

  1. Você realmente deve aprender a usar o navegador de classe. Isso pode responder às perguntas (frequentes) "que mensagens que pode enviar para objetos da classe X"
  2. É comum, no ST, para adicionar novos métodos para classes existentes. Então se você quer aleatória ter entre: e :, basta adicioná-la, por exemplo, como

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

Para colocá-lo simplesmente, sem saber o dialeto Smalltalk, eu só posso dar uma resposta geral. A maneira como você declarou a pergunta aleatória, sim essa é a única maneira de fazê-lo se o seu professor precisa de uma resposta genérica.

Quanto ao e / ou declarações pergunta,

e / ou declarações. Este um insetos vivos daylights fora de mim. Eu tentei várias configurações diferentes de

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

O que você quer tentar é:

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

Observe os colchetes, o e:. Método leva um bloco como um argumento

Para criar vários inteiros aleatórios entre 1 e 1000
Primeiro crie uma série de números aleatórios. Faça isso apenas uma vez.

Em seguida, crie um novo número aleatório, tomando o próximo número da série. Repita conforme necessário.

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"

Operações lógicas

aBoolean irá responder a and: e or:. Ambos take argumentos bloco .

Aqui está como eles funcionam.

and: alternativeBlock
Se o receptor é verdade, responda o valor de alternativeBlock; caso contrário, responder falsa sem avaliar alternativeBlock.

or: alternativeBlock
Se o receptor é falsa, responda o valor de alternativeBlock; caso contrário resposta verdadeira sem avaliar alternativeBlock.

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

No entanto, Squeak e Pharo Smalltalks serão ambos aceitar um argumento entre parênteses ( )
Dolphin Smalltalk não vai, e exige rigorosamente a sintaxe padrão Smalltalk de um argumento bloco.

Outros métodos relacionados:
& um e que não requer uma praça bracketted (ou seja bloco) argumento
| um ou que não requer uma praça bracketted (ou seja bloco) argumento
& e | trabalho no âmbar, Cuis, Gnu, Pharo, Squeak, VisualAge e VisualWorks Smalltalks.

Squeak Smalltalk também fornece:
and:and: }
and:and:and: } Estes argumentos bloco tirar várias
and:and:and:and }

or:or: }
or:or:or: } Estes argumentos bloco tirar várias
or:or:or:or: }

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top