如何在Smalltalk的范围内生成随机整数?

hel*_*dre 3 random smalltalk logical-operators

我正在学习的课程要求我们在smalltalk中完成所有编码(这是一个Design类).在我们的一个项目中,我希望做一些事情,并且很难找到如何做到这些.似乎大多数人所做的就是修改自己的smalltalk版本来做他们需要做的事情.我不能自由地这样做,因为当我没有相同的内置方法时,这会导致我教授的计算机出错.

这是我要做的事情:

随机数.我需要创建一个1到1000之间的随机数.现在我正在伪造它

rand := Random new.
rand := (rand nextValue) * 1000.
rand := rand asInteger.
Run Code Online (Sandbox Code Playgroud)

这给了我一个0到1000之间的数字.有没有办法在一个命令中执行此操作?相近

Random between: 0 and: 1000
Run Code Online (Sandbox Code Playgroud)

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

(statement) and: (statement) ifTrue...
(statement) and (statement) ifTrue...
Run Code Online (Sandbox Code Playgroud)

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

(statement) ifTrue:[
    (statement) ifTrue:[...
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*wis 6

问题是

 (expr) and: (expr) ifTrue: aBlock
Run Code Online (Sandbox Code Playgroud)

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

((expr) and: (expr)) ifTrue: aBlock
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

(aBoolean and: [anotherBoolean]) ifTrue: [doSomething].
Run Code Online (Sandbox Code Playgroud)

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

aBoolean & anotherBoolean ifTrue:[doSomething].
Run Code Online (Sandbox Code Playgroud)

不同之处在于:仅在第一个bool为真时(类似于java)&评估块中的内容,同时始终对两者进行求值.

因此and:就派上用场了,如果第二个条件是计算量很大,或者如果它包括状态改变时,第一个条件是真的,应该只发生.(虽然这通常是一个糟糕的设计).

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