我正在学习的课程要求我们在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:
如果你看一下布尔类(特别是True或False),你会注意到ifTrue:只是一个常规方法,并且没有方法和:ifTrue:存在 - 但是,plain和:确实存在.所以要明确这些是两条消息,写一下
((expr) and: (expr)) ifTrue: aBlock
对于更长的布尔组合,请注意还有方法和:和:和:和:和:和:已实现.
如果您正在使用VisualWorks,并且:将块作为参数,那么您将编写:
(aBoolean and: [anotherBoolean]) ifTrue: [doSomething].
还有&
,它不会作为参数,
aBoolean & anotherBoolean ifTrue:[doSomething].
不同之处在于:仅在第一个bool为真时(类似于java)&
评估块中的内容,同时始终对两者进行求值.
因此and:
就派上用场了,如果第二个条件是计算量很大,或者如果它包括状态改变时,第一个条件是真的,应该只发生.(虽然这通常是一个糟糕的设计).
对于Random,只要你提供自定义方法,Random >> between: and:
以及代码的其余部分,它就可以在你的教授计算机上正常运行.具体如何做,取决于您应该提供作业的格式.
(1 to: 1000) atRandom