我试图在smalltalk中做一个算术序列类,在做一个printOn方法时遇到了一些麻烦。
这是我的代码,由于某种原因,一旦进入主体部分,它就会失败,但是我不明白为什么
printOn: aStream
|i retValue|
retValue := ''.
i := 0.
[i < myCount ] whileTrue: [retValue := retValue + ('', self valueOf: i). i := i -1.].
aStream nextPutAll: retValue
最佳答案
,
是二进制消息。它具有比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
发送到结果