我正在学习的课程要求我们在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中执行和/或随机的正确方法是什么?
答案 0 :(得分:6)
问题在于
(expr) and: (expr) ifTrue: aBlock
被解析为方法and:ifTrue:
如果你看一下布尔类(特别是True或False),你会注意到ifTrue:只是一个常规方法,没有方法和:ifTrue:存在 - 但是,平原和:确实如此。所以要明确这些是两条消息,写一下
((expr) and: (expr)) ifTrue: aBlock
对于更长的布尔组合,请注意还有方法和:and:and和:and:and:implements。
答案 1 :(得分:5)
如果您正在使用VisualWorks,并且:将一个块作为参数,那么您可以写:
(aBoolean and: [anotherBoolean]) ifTrue: [doSomething].
还有&
,它不会将块作为参数,
aBoolean & anotherBoolean ifTrue:[doSomething].
不同之处在于:仅在第一个bool为真时评估块中的内容(类似于java),而&
始终评估两者。
因此,如果第二个条件在计算上是昂贵的,或者如果它包括仅在第一个条件为真时才发生的状态改变,则and:
会派上用场。 (虽然这通常是一个糟糕的设计)。
对于Random,只要您提供自定义方法Random >> between: and:
以及其余代码,它就可以在您的教授计算机上正常运行。具体如何做,取决于你应该提供作业的格式。
答案 2 :(得分:5)
(1 to: 1000) atRandom
答案 3 :(得分:4)
至于随机问题:它取决于您使用的ST版本。在Squeak 3.9中,有Random>>#nextInt:
,它被记录为“在区间[1,anInteger]中回答一个随机整数。”。它的实现读取
(self next * anInteger) truncated + 1
所以我在这里有两条评论:
在ST中,通常会向现有类添加新方法。因此,如果您希望Random位于:和:之间,只需添加它,例如如
between: low and: high
^(self next * (high-low+1)) truncated + low
答案 4 :(得分: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的值;否则在不评估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 ,不需要方括号(即块)参数
&
和|
在Amber,Cuis,Gnu,Pharo,Squeak,VisualAge和VisualWorks Smalltalks工作。
Squeak Smalltalk还提供:
and:and: }
and:and:and: }
这些采用多个块参数
and:and:and:and }
or:or: }
or:or:or: }
这些采用多个块参数
or:or:or:or: }
答案 5 :(得分:0)
简单地说,在不知道Smalltalk方言的情况下,我只能给出一般答案。你说出随机问题的方式,是的,如果你的教授需要一个通用的答案,这是唯一的方法。
至于和/或陈述问题,
和/或陈述。这个人把我的生活日光所困扰。我尝试了几种不同的配置
(statement) and: (statement) ifTrue...
(statement) and (statement) ifTrue...
您想要尝试的是:
(statement) and: [statement] ifTrue: [ ... ]
注意括号,and和方法将块作为参数。