我正在尝试在smalltalk中执行算术序列类,我在执行printOn方法时遇到了一些麻烦。 这是我的代码,由于某种原因,它会失败到达自我部分,我不明白为什么虽然
printOn: aStream
|i retValue|
retValue := ''.
i := 0.
[i < myCount ] whileTrue: [retValue := retValue + ('', self valueOf: i). i := i -1.].
aStream nextPutAll: retValue
答案 0 :(得分:10)
,
是二进制消息。它的优先级高于valueOf:
关键字消息。你实际执行的是这样的:
('', self) valueOf: i
您需要使用括号明确告诉您首先要执行valueOf:
:
'', (self valueOf: i)
retValue + "probably string"
。您确定要在字符串中+
而不是,
这是串联吗?
从0开始,每步减少i
1。你确定你不会陷入无限循环吗?
为什么需要whileTrue:
?你不能做这样的事情:
1 to: myCount do: [ :i |
retValue := retValue + ('', (self valueOf: i - 1)) ]
另请注意,在Smalltalk中,你的第一个索引是0,最后一个是myCount,这很奇怪.1。通常你从1开始,以收集的大小结束。
我刚刚注意到你实际上是在用self valueOf: i
连接一个空字符串。这没有任何意义。
如果您只需要在流上打印内容,请执行以下操作:
printOn: aStream
1 to: myCount do: [ :i |
aStream nextPutAll: (self valueOf: i) asString) ]
或
printOn: aStream
(1 to: myCount)
do: [ :i | aStream nextPutAll: (self valueOf: i) asString) ]
separatedBy: [ aStream nextPutAll: ', ' ]
我不知道valueOf:
是否返回字符串,如果是,则无需向结果发送asString
答案 1 :(得分:6)
Smalltalk有一个严格的优先顺序来评估消息。
首先评估括号()内的表达式
然后是一元消息(由一个对象组成的消息后跟一条消息)
然后是二进制消息(由一个对象组成的消息,后跟非字母字符,后跟另一个对象)
然后最后评估关键字消息 - 即关键字消息。 (关键字是以冒号结尾的字母字符串,关键字消息可以包含多个关键字)
在优先级相等的情况下,表达式从左到右进行计算。
在您编写的表达式中,第一个元素在
中计算 retValue + ( '', self valueOf: i)
是
( '', self valueOf: i)
在该表达式中评估的第一个元素是
'', self
然后它的结果成为
的接收者 valueOf: 1
关键字消息。
顺便说一下,我会写
i:= i - 1
要确保anySmalltalk能够正确地将其解释为二进制表达式,而不是i后跟一个整数对象,-1