我正在学习的课程要求我们在smalltalk中完成所有编码(这是一个Design类)。在我们的一个项目中,我希望做一些事情,并且很难找到如何做到这些。似乎大多数人所做的就是修改自己的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中执行和/或随机的正确方法是什么?

有帮助吗?

解决方案

问题在于

 (expr) and: (expr) ifTrue: aBlock

被解析为方法and:ifTrue:如果查看Boolean类(特别是True或False),您会注意到ifTrue:只是一个常规方法,并且没有方法和:ifTrue:存在 - 但是,平原和:确实。所以要明确这些是两条消息,写一下

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

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

其他提示

(1 to: 1000) atRandom

如果您正在使用VisualWorks,并且:将一个块作为参数,那么您可以写:

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

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

aBoolean & anotherBoolean ifTrue:[doSomething].

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

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

对于Random,只要你提供自定义方法<=>以及代码的其余部分,它就可以在你的教授计算机上正常运行。具体如何做,取决于你应该提供作业的格式。

至于随机问题:它取决于您使用的ST版本。在Squeak 3.9中,有Random>>#nextInt:,记录为<!> quot;在区间[1,anInteger]中回答一个随机整数。<!> quot;。它的实现读取

(self next * anInteger) truncated + 1

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

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

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

简单地说,在不知道Smalltalk方言的情况下,我只能给出一般答案。你说出随机问题的方式,是的,如果你的教授需要一个通用的答案,这是唯一的方法。

至于和/或陈述问题,

  

和/或陈述。这个人把我的生活日光所困扰。我尝试了几种不同的配置

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

您想要尝试的是:

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

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

创建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的值;否则在不评估alternativeBlock的情况下回答错误。

or: alternativeBlock结果 如果接收方为假,则回答alternativeBlock的值;否则在不评估alternativeBlock的情况下回答为真。

e.g。,点击 ( 3 > 2 ) or: [ 3 < 4 ] ifTrue: [ ]结果 aBoolean and: [ anotherBoolean ] ifFalse: [ ]

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

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

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

or:or:or:or: }结果 <=>这些采用多个块参数
<=>

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top