我试图在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发送到结果

10-07 21:53
查看更多