3

我目前正在上的一门课要求我们在 smalltalk 中完成所有编码(这是一门设计课)。在我们的一个项目中,我想做一些事情,但很难找到如何去做。似乎大多数人所做的只是修改他们自己的 smalltalk 版本来做他们需要它做的事情。我不能这样做,因为当我的教授没有与我相同的内置方法时,这会导致我的教授的计算机出现错误。

这是我想要做的:

随机数。我需要创建一个介于 1 到 1000 之间的随机数。现在我正在通过这样做来伪造它

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

这给了我一个 0 到 1000 之间的数字。有没有办法在一个命令中做到这一点?如同

Random between: 0 and: 1000

和/或语句。这让我大吃一惊。我尝试了几种不同的配置

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

所以我用嵌套的 ifTrue 语句来伪造它:

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

在smalltalk中做和/或随机的正确方法是什么?

4

6 回答 6

6

问题是

 (expr) and: (expr) ifTrue: aBlock

被解析为方法and:ifTrue: 如果您查看 Boolean 类(特别是 True 或 False),您会注意到 ifTrue: 只是一个常规方法,并且没有方法 and:ifTrue: 存在 - 但是,plain and: 存在。因此,为了清楚地表明这是两条消息,请写

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

对于更长的布尔组合,请注意还有方法 and:and: and and:and:and: 实现。

于 2008-11-07T06:51:45.880 回答
6
(1 to: 1000) atRandom
于 2008-11-22T09:09:54.813 回答
5

如果您使用的是 VisualWorks,并且: 将块作为参数,那么您将编写:

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

还有&, 它不将块作为参数,

aBoolean & anotherBoolean ifTrue:[doSomething].

区别是 and: 仅在第一个 bool 为真时才评估块中的内容(类似于 java),而&始终评估两者。

如果第二个条件在计算上很昂贵,或者如果它包括仅在第一个条件为真时才应该发生的状态更改,则因此and:会派上用场。(虽然这通常是一个糟糕的设计)。

至于 Random,只要您提供自定义方法Random >> between: and:以及其余代码,它就可以在您的教授计算机上正常运行。具体如何做到这一点,取决于您应该以何种格式交付作业。

于 2008-11-12T22:38:18.403 回答
4

至于随机问题:这取决于您使用的 ST 版本。在 Squeak 3.9 中,有Random>>#nextInt:,它被记录为“Answer a random integer in the interval [1, anInteger].”。它的实现如下

(self next * anInteger) truncated + 1

所以我在这里有两条评论:

  1. 你真的应该学会使用类浏览器。这可以回答(常见的)问题“我可以向 X 类的对象发送什么消息”
  2. 在 ST 中,向现有类添加新方法是很常见的。因此,如果您希望 Random 具有 between:and:,只需添加它,例如

    between: low and: high      
       ^(self next * (high-low+1)) truncated + low
    
于 2008-11-07T08:15:41.390 回答
0

创建几个 1 到 1000 之间的随机整数
首先创建一个随机数系列。只做一次。

然后通过从系列中获取下一个数字来创建一个新的随机数。根据需要重复。

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"

逻辑运算

aBoolean将响应and:or:。他们都接受块论点

以下是它们的工作方式。

and: alternativeBlock
如果接收者为真,则回答alternativeBlock的值;否则在不评估替代块的情况下回答错误。

or: alternativeBlock
如果接收者为假,则回答alternativeBlock的值;否则在不评估替代块的情况下回答 true。

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

然而,Squeak 和 Pharo Smalltalks 都将接受括号中的参数( )
Dolphin Smalltalk 不会,并且严格要求块参数的标准 Smalltalk 语法。

其他相关方法:不需要方括号(即块)参数
&AND不需要方括号(即块)参数并在 Amber、Cuis、Gnu、Pharo、Squeak、VisualAge 和 VisualWorks Smalltalks 中工作
|OR 。
&|

Squeak Smalltalk 还提供:
and:and: }
and:and:and: } 这些采用多个块参数
and:and:and:and }

or:or: }
or:or:or: } 这些采用多个块参数
or:or:or:or: }

于 2015-11-22T13:30:35.027 回答
0

简单来说,在不懂Smalltalk方言的情况下,只能给出一个笼统的答案。您提出随机问题的方式,是的,如果您的教授需要通用答案,那是唯一的方法。

至于和/或陈述问题,

和/或语句。这让我大吃一惊。我尝试了几种不同的配置

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

你想尝试的是:

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

注意括号,and: 方法将块作为参数。

于 2015-11-23T07:54:54.490 回答